如何在bash for循环中使用变量[重复]
Posted
技术标签:
【中文标题】如何在bash for循环中使用变量[重复]【英文标题】:How to use variables in a bash for loop [duplicate] 【发布时间】:2013-06-15 10:18:42 【问题描述】:如何在 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 循环的帮助。
【问题讨论】:
zsh
最适合 :-)
【参考方案1】:
在 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
【讨论】:
【参考方案2】:大括号替换在任何其他替换之前执行,因此您需要使用eval
或
第三方工具,如seq
。
评估示例:
for i in `eval echo 0..$length`; do echo $i; done
这个信息其实可以在man bash
找到:
序列表达式采用 x..y[..incr] 形式,其中 x 和 y 是 整数或单个字符,而可选增量 incr 是整数。 [...]
大括号扩展在任何其他扩展之前执行,并且任何特殊字符 结果中保留了其他扩展。它是严格的文本。 Bash 不对扩展的上下文应用任何句法解释 或大括号之间的文字。
【讨论】:
【参考方案3】:一种方法是使用eval
:
for i in $( eval echo 0..$length )
do
echo "do something right $i"
done
注意当您设置 length=;ls
或 length=; 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
【讨论】:
可以省略双括号中的$
符号来引用变量以上是关于如何在bash for循环中使用变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 BASH 中使用嵌套 for 循环运行 2x3x6 变量循环