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

Cla*_*ied 32 linux bash for-loop

如何在bash for循环中使用变量?如果我只是使用标准for循环,它会做我期望的

for i in {0..3}
do
   echo "do some stuff $i"
done
Run Code Online (Sandbox Code Playgroud)

这很好用.它循环4次,0到3次,打印我的消息并将计数结束.

do some stuff 0
do some stuff 1
do some stuff 2
do some stuff 3
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下for循环时,它似乎等于一个字符串,这不是我想要的.

length=3
for i in {0..$length}
do
   echo "do something right $i"
done
Run Code Online (Sandbox Code Playgroud)

输出:

do something right {0..3}
Run Code Online (Sandbox Code Playgroud)

我试过了

for i in {0.."$length"} and for i in {0..${length}} (both output was {0..3})
Run Code Online (Sandbox Code Playgroud)

和

for i in {0..'$length'} (output was {0..$length})
Run Code Online (Sandbox Code Playgroud)

他们都不做我需要的事.希望有人可以帮助我.在此先感谢任何bash专家对for循环的帮助.

per*_*eal 44

一种方法是使用eval:

for i in $( eval echo {0..$length} )
do
       echo "do something right $i"
done
Run Code Online (Sandbox Code Playgroud)

注意设置时会发生什么length=;ls或length=; rm *(尽管不尝试后者).

安全地,使用seq:

for i in $( seq 0 $length )
do
       echo "do something right $i"
done
Run Code Online (Sandbox Code Playgroud)

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

for (( i = 0; i <= $length; i++ )) 
do 
       echo "do something right $i"
done
Run Code Online (Sandbox Code Playgroud)

  • +1不是"eval"的粉丝,而是像你在这个答案中给出各种选项的方式. (3认同)
  • C风格的循环显然是最好的选择. (2认同)
  • 可以省略双括号中的“$”符号来引用变量 (2认同)

pax*_*blo 7

在bash中,括号扩展是第一尝试如此步骤,在该点处,$length也不会被取代.

bash的联机帮助页明确指出:

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

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

pax> for i in $(seq 0 $length) ; do echo $i ; done
0
1
2
3
Run Code Online (Sandbox Code Playgroud)

虽然这可能会给你一个庞大的命令行,如果length是庞大的.

另一种方法是使用类C语法:

pax> for (( i = 0; i <= $length; i++ )) ; do echo $i; done
0
1
2
3
Run Code Online (Sandbox Code Playgroud)


nem*_*emo 6

大括号替换在任何其他替换之前执行,因此您需要使用eval或第三方工具,如seq.

评估示例:

for i in `eval echo {0..$length}`; do echo $i; done
Run Code Online (Sandbox Code Playgroud)

这些信息实际上可以在man bash以下位置找到:

序列表达式采用 {x..y[..incr]} 形式,其中 x 和 y 是整数或单个字符,而 incr 是一个可选增量,是一个整数。[...]

大括号扩展在任何其他扩展之前执行,并且任何其他扩展所特有的字符都保留在结果中。 它是严格的文本。Bash 不对扩展的上下文或大括号之间的文本应用任何句法解释。