【问题标题】:Bash loop and function parameter expansionBash循环和函数参数扩展
【发布时间】:2012-02-08 08:30:23
【问题描述】:

我在 bash 脚本中有一个微不足道的 for 循环,它不起作用,我看不出有什么问题。

#!/bin/bash
function deleteOut {

for index in {0..$1}
do
    echo "/bin/rm -rf ./OUT/Message_${index}.log"
    /bin/rm -rf ./OUT/Message_${index}.log
done
}

并使用

调用它

deleteOut 5

我期待像这样的循环

    /bin/rm -rf ./OUT/Message_0.log
    /bin/rm -rf ./OUT/Message_1.log
    /bin/rm -rf ./OUT/Message_2.log
    /bin/rm -rf ./OUT/Message_3.log
    /bin/rm -rf ./OUT/Message_4.log
    /bin/rm -rf ./OUT/Message_5.log

相反,我得到了

/bin/rm -rf ./OUT/Message_{0..5}.log 

我已经解决了这样的问题

find ./OUT -name "Message_*.log" | xargs /bin/rm 

但这不是重点。为什么我的第一种方法不起作用?

【问题讨论】:

    标签: bash for-loop


    【解决方案1】:

    使用eval 或子shell

    大括号扩展出现在之前变量扩展

     for index in $(eval "echo {0..$q}")
     do 
         echo $index
     done
    

    【讨论】:

      【解决方案2】:

      你可以使用seq,一般来说比eval更安全:

      for index in $(seq $1)
      

      甚至更快without any external program:

      for ((index=1; index<=$1; index++))
      

      【讨论】:

      • 如果 index=0,第二个命令是正确的。第一个命令不可用,因为范围是 0..$1 和 seq(据我所知)从 1 开始。但实际上您正在回答如何循环文件,而我的问题是关于范围内的参数扩展。 “sehe”的答案是正确的:“大括号扩展出现在变量扩展之前”(我不知道)。无论如何,谢谢你的回答。
      • 该链接解释了扩展问题并链接到更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多