2012-02-08 98 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