【问题标题】:How to use variables in a bash for loop [duplicate]如何在bash for循环中使用变量[重复]
【发布时间】: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 最适合 :-)

标签: linux bash for-loop


【解决方案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
      

      【讨论】:

      • 可以省略双括号中的$ 符号来引用变量
      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多