3

例如,在 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

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

4

4 回答 4

6

Fish 不支持大括号扩展中的范围,仅支持逗号分隔值: {a,b,c}.

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

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

哪里$,是输出字段分隔符。

输出

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

您可能会发现表很有用。

于 2016-12-03T03:58:03.163 回答
1

一种方法是使用 printf 和 seq。

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

这通过生成 "\x61 \x62 \x63 ... \x7a" 来工作,然后由 "echo -e" 解释为十六进制字符代码。

于 2019-01-18T19:06:08.393 回答
0

特别是为了生成可以循环使用的 az 序列,我认为最优雅和简洁的解决方案是直接将 bash 与fmt一起使用(在大多数类 unix 环境中都可用)。你甚至不需要 Perl 并且它的可读性更强:

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

逻辑是这样的:

  1. fish shell 中的 for 循环遍历数组值和行。如果您可以在单独的行中生成 az each,则可以在 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会将空格分隔的字符串切割成行。

结果:

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

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

于 2020-09-17T05:35:42.677 回答
-1

Linux 有这个seq命令,它适用于fishshell:

$ for f in (seq 1 10)
    echo $f
end
1
2
3
4
5
6
7
8
9
10
$
于 2018-09-11T16:51:32.793 回答