2012-04-08 11 views
2

シェルスクリプトに提供されたファイルの内容を引数で表示します。私は通常の 'for(())'ループを使用してこれを行う必要があり、 'for x in arr'ループは必要ありません。シェルスクリプトのforループを使用して引数リストを反復処理しますか?

これは私のコードです。どのように私はそのcatコマンドのファイル名を正しく置くべきですか?

for ((i=1;$i<=$#;i=$i+2)) 
do 
    cat '$'$i #display the contents of the file currently being traversed 
done 
+0

どのように「for(())」が正常ですか?他の形式を使用する方がはるかに一般的です。 –

答えて

2

あなたはのようなものを使用することができます:パラメータの最初の文字が感嘆符である場合は、変数間接のレベル が導入され

for ((i=1;$i<=$#;i=$i+1)) 
do 
    cat ${!i} #display the contents of the file currently being traversed 
done 

対応マニュアルのセクションを。 Bashは、 変数の値を残りのパラメータから形容詞 の名前として使用します。この変数は展開され、その値はパラメータ自体の値ではなく、置換の残りの部分に使用されます。 これは間接的な拡張と呼ばれます。例外は、以下で説明する$ {!prefix *}と$ {!name [@]}を展開した です。間接参照を導入するには、 の感嘆符を左の中括弧の直後に置く必要があります。

+0

100万tonioありがとう! :) – Ivin

2

forループの通常の動作は、引数を反復することです。

この例では、多くの異なる方法で実行するように、それをわずかに変更して、他のすべての引数に対してのみ操作することができます。一つの可能​​性は次のとおりです。

for x; do expr $((i++)) % 2 > /dev/null || cat "$x"; done 

あなたは非標準のフォームを使用して主張する場合は、シェルの大多数に失敗した$ bashism使用することができ、またはあなたがeval

を使用することができます{VARを!}
for ((i = 1; i <= $#; i += 2)) 
do 
    eval cat '"$'$i\" 
done 
関連する問題