2012-02-08 118 views
2

我有一个循环在bash脚本中不起作用,我看不出什么是错的。Bash循环和函数参数扩展

#!/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 

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

回答

2

使用eval或子shell

括号扩展来变量扩展

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

您可以使用seq,这是一般较安全eval

for index in $(seq $1) 

甚至更​​快without any external program

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

如果index = 0,则第二个命令将是正确的。第一个命令是不可用的,因为范围是0 .. $ 1和seq(据我所知)从1开始。但实际上你正在回答如何遍历文件,而我的问题是关于范围中的参数扩展。 “sehe”的答案是正确的:“Brace扩展在变量扩展之前出现”(我不知道它)。无论如何,谢谢你的回答。 – Luixv 2012-02-08 14:09:07

+0

该链接解释了扩展问题以及更多信息的链接。 – l0b0 2012-02-08 14:35:08