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)
在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)
大括号替换在任何其他替换之前执行,因此您需要使用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 不对扩展的上下文或大括号之间的文本应用任何句法解释。