如何在 bash for 循环中使用变量

新手上路,请多包涵

如何在 bash for 循环中使用变量?如果我只使用标准 for 循环,它会达到我的预期

for i in {0..3}
do
   echo "do some stuff $i"
done

这工作正常。它循环 4 次,包括 0 到 3 次,打印我的消息并将计数放在最后。

 do some stuff 0
do some stuff 1
do some stuff 2
do some stuff 3

当我用下面的 for 循环尝试同样的事情时,它似乎等于一个字符串,这不是我想要的。

 length=3
for i in {0..$length}
do
   echo "do something right $i"
done

输出:

 do something right {0..3}

我试过了

for i in {0.."$length"} and for i in {0..${length}} (both output was {0..3})

for i in {0..'$length'} (output was {0..$length})

他们都没有做我需要的。希望有人可以帮助我。提前感谢任何 bash 专家对 for 循环的帮助。

原文由 Classified 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

一种方法是使用 eval

 for i in $( eval echo {0..$length} )
do
       echo "do something right $i"
done

请注意 当您设置 length=;lslength=; rm * 时会发生什么(但不要尝试后者)。

_安全地_,使用 seq

 for i in $( seq 0 $length )
do
       echo "do something right $i"
done

或者您可以使用 c 风格的 for 循环,这也是安全的:

 for (( i = 0; i <= $length; i++ ))
do
       echo "do something right $i"
done

原文由 perreal 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 bash 中,大括号扩展是尝试的 _第一步_,因此此时 $length 不会被替换。

bash 的联机帮助页清楚地指出:

序列表达式采用 {x..y[..incr]} 的形式,其中 x 和 y 是 整数或单个字符

有多种可能性,例如使用:

 pax> for i in $(seq 0 $length) ; do echo $i ; done
0
1
2
3

尽管如果 length 很大,这可能会给你一个很大的命令行。

另一种选择是使用类似 C 的语法:

 pax> for (( i = 0; i <= $length; i++ )) ; do echo $i; done
0
1
2
3

也可以省略 $双括号 中签名以引用变量:

 ubuntu@ip-172-31-28-53:~/playground$ length=3;
ubuntu@ip-172-31-28-53:~/playground$ for ((i=0;i<=length;i++));do echo $i;done
0
1
2
3

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题