2

引数を介してシェルスクリプトに提供されたファイルの内容を表示したいと思います。これは、通常の'for(())'ループを使用して行う必要があり、'for xinarr'ループではありません。

これは私のコードです。そのcatコマンドのファイル名を正しく入力するにはどうすればよいですか?

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

2 に答える 2

2

次のようなものを使用できます。

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

対応するマニュアルセクション:

パラメータの最初の文字が感嘆符である場合、可変間接化のレベルが導入されます。Bashは、残りのパラメーターから形成された変数の値を変数の名前として使用します。次に、この変数が展開され、パラメーター自体の値ではなく、その値が残りの置換で使用されます。これは、間接拡張として知られています。これに対する例外は、以下で説明する$ {!prefix*}と${!name[@]}の拡張です。感嘆符は、間接参照を導入するために、左中括弧の直後に続く必要があります。

于 2012-04-08T07:23:41.927 に答える
2

forループの通常の動作は、引数を反復処理することです。すべての引数を繰り返すには:

#!/bin/sh -e
for x; do cat $x; done

これを少し変更して、例のように他のすべての引数のみをさまざまな方法で操作することができます。1つの可能性は次のとおりです。

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

非標準形の使用を主張する場合は、大多数のシェルで失敗する$ {!var}バシズムを使用するか、次のように使用できます。eval

for (( i = 1; i <= $#; i += 2 ))
do
    eval cat '"$'$i\"
done
于 2012-04-08T07:54:35.517 に答える