2012-02-08 4 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 
} 

とする代わりに、私は

/bin/rm -rf ./OUT/Message_{0..5}.log 
012を得た私は

/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 

のようなループを期待していた

deleteOut 5

使用してそれを呼ばれます

私は

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

をこのような何かをやって問題を解決してきましたが、これはポイントではありません。なぜ私の最初のアプローチがうまくいかなかったのですか?

答えて

2

使用evalまたは

ブレース展開をサブシェル前に変数展開は、あなたが一般的にevalよりも安全であるseqを、使用することができます

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

来る:

for index in $(seq $1) 

あるいはさらに速くwithout any external program

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

2番目のコマンドは、index = 0の場合は正しくなります。最初のコマンドは使用できません。範囲は0 .. $ 1とseq(私が知る限り)は1から始まります。しかし実際には、ファイルのループ処理の方法には答えていますが、問題は範囲のパラメータ拡張に関するものです。 "sehe"の答えは正しいです: "ブレース拡張は変数拡張の前に来ます"(私はそれを知らなかった)。とにかく、あなたの答えをありがとう。 – Luixv

+0

このリンクでは、拡張の問題と詳細な情報へのリンクが説明されています。 – l0b0

関連する問題