如何在fish中生成字母序列表shell

How to generate letter sequence list in fish shell

在bash中,您可以轻松生成字母序列,例如“{a..z}”,例如

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

如何在鱼中做到这一点 shell?

Fish 不支持 brace expansion 中的范围,仅支持逗号分隔值:{a,b,c}

因此,我们不得不寻找能够生成这样序列的命令。例如,您可以使用 Perl:

for c in (perl -e '$,="\n"; print ("a" .. "z")')
  printf ">> %s\n" "$c"
end

其中 $, 是输出字段分隔符。

输出

>> a
>> b
...(skipped)
>> y
>> z

您可能会发现 this table 有用。

Linux 对此有 seq 命令,它适用于 fishshell:

$ for f in (seq 1 10)
    echo $f
end
1
2
3
4
5
6
7
8
9
10
$

一种方法是使用 printf 和 seq。

echo -e (printf '\\x%x\n' (seq 97 122))

这通过生成“\x61 \x62 \x63 ... \x7a”来实现,然后 "echo -e" 将其解释为十六进制字符代码。

专门生成可以循环使用的a-z序列,我认为最优雅简洁的解决方案是直接使用bash和fmt(大多数unix-like环境)。您甚至不需要 Perl,它的可读性更高:

for c in (bash -c "echo {a..z}" | fmt -w1)
    echo "hello $c"
end

逻辑是这样的:

  1. fish shell 中的 for-loop 循环遍历数组值和行。如果您可以在其单独的行中生成每个 a-z,则可以在 fish 中循环使用它。

  2. 命令 bash -c "echo {a..z}" 会在 fish 中给你一个长字符串:

    a b c d e f g h i j k l m n o p q r s t u v w x y z
    
  3. 命令 fmt -w1 会将 space-separated 字符串切割成行。

结果:

hello a
hello b
hello c
... (skipped)
hello z

这太棒了,因为您可以利用相同的原则在 fish 中重用 bash 语法。对我来说似乎真的很灵活:-)