如何在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=;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

【讨论】:

可以省略双括号中的$ 符号来引用变量

以上是关于如何在bash for循环中使用变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

for循环子命令中的bash变量扩展[重复]

在 BASH 中使用嵌套 for 循环运行 2x3x6 变量循环

用`let`定义的变量如何在`for`循环中起作用[重复]

[Linux Shell学习系列七]Bash循环——1for循环

如何在带有 for 循环的 bash 脚本中使用标志?

在 bash 脚本中,如何引用单独的文件以在 for 循环中使用它? [复制]