for循环范围内的bash变量

cof*_*Mug 18 bash for

我想打印从 1 到 100 的数字列表,并使用如下所示的 for 循环:

number=100
for num in {1..$number}
do
  echo $num
done
Run Code Online (Sandbox Code Playgroud)

当我执行命令时,它只打印 {1..100} 而不是从 1 到 100 的数字列表。

Sté*_*las 26

是的,那是因为大括号扩展发生在参数扩展之前。既可以使用另一壳状zshksh93或使用替代的语法:

标准 (POSIX) sh 语法

i=1
while [ "$i" -le "$number" ]; do
  echo "$i"
  i=$(($i + 1))
done
Run Code Online (Sandbox Code Playgroud)

Ksh 风格 for ((...))

for ((i=1;i<=number;i++)); do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

使用eval(不推荐)

eval '
  for i in {1..'"$number"'}; do
    echo "$i"
  done
'
Run Code Online (Sandbox Code Playgroud)

seq在可用的系统上使用 GNU命令

unset -v IFS # restore IFS to default
for i in $(seq "$number"); do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

(那个效率较低,因为它派生并运行一个新命令并且外壳必须从管道读取其输出)。

避免外壳中的循环。

在 shell 脚本中使用循环通常表明您做得不对。

最有可能的是,您的代码可以用其他方式编写。

  • 这是题外话,但我还是要问:shell 中的循环有什么问题?为什么使用它们不好? (11认同)
  • [为什么建议避免在 shell 中使用循环](http://unix.stackexchange.com/questions/198639/avoid-loops-in-shells)?存在循环滥用的常见情况,例如使用 `while read` 而不是 sed/awk/...,或者循环遍历 `find` 的输出而不是使用 `-exec`。但是一揽子“避免贝壳中的循环”走得太远了。 (9认同)
  • @Wildcard 例如,处理从通配符模式获得的文件列表,或迭代数组元素。您链接的答案是关于处理文本的,即便如此,在某些情况下,“while read”循环也完全没有问题。 (2认同)

slm*_*slm 7

为此,您甚至不需要 for 循环,只需使用以下seq命令:

$ seq 100
Run Code Online (Sandbox Code Playgroud)

例子

这是打印出来的前 10 个数字:

$ seq 100 | head -10
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)