2012-01-29 3 views
269

私は、最初の引数がファイル名のために予約されていて、他のすべてのオプションの引数がスクリプトの他の部分に渡される単純なスクリプトを持っています。最初のもの以外のすべての引数を処理する(bashスクリプト内)

Googleアカウントを使用して、私はthis wikiを見つけたが、それは文字通りの例提供:

echo "${@:2}" 

または

echo "${@:2,1}" 

echo "${@: -1}" 

を私は次のように、動作するように何かを得ることができません

端末から「不正な置換」を取得しました。

どのような問題がありますか?bashスクリプトに渡された最初の引数以外はどのように処理できますか?

+4

混乱している人を呼び出すために間違ったシバンが提供され、 '' {@:2}」が動作しなくなりました。 – Guvante

+2

あなたはちょうどUbuntuと他の多くのLinuxでダッシュされているデフォルトシェルを使用しました。 "$ {@:-1}"は次のように解釈されます。 {parameter:-word} - デフォルト値を使用し、パラメータが定義されていないかnullの場合はwordを使用します。 ダッシュ "$ {@:-1}"の結果は "$ @"とまったく同じです。 #!/ bin/bash – luart

答えて

376

使用この:

echo "${@:2}" 

次の構文:

echo "${*:2}" 

は同様に動作しますが、@Gordonとして、既に説明しているため*を使用して、それが実行されることを、お勧めしませんすべての引数を空白付きの1つの引数としてまとめますが、@はそれらの間にブレークを保持します(たとえ引数の一部がcontaスペースで)。 echoとの違いはありませんが、他の多くのコマンドでは重要です。

+2

私はちょうど私のシバンが悪いことに気づきました: '#!/ usr/bin/env sh'それは私が問題を抱えている理由です。上記のようにうまく動作します。 – theta

+92

代わりに '' $ {@:2}」を使用します。 '*'を使用すると、すべての引数をスペースで1つの引数として一緒に実行し、 '@ '(それらの引数の中には空白が含まれていても)それらの間の区切りを保持します。違いは 'echo'では目立ちませんが、他の多くのものにとっては重要です。 –

+0

@ GordonDavissonここでのポイントは、引数を一緒に実行することです。ファイル名を渡していれば正しいでしょう。 'echo'はあなたのためにそれらを連結するのに十分な寛容です。他のコマンドはあまりうまくいかないかもしれません。どちらか一方を使うだけではなく、 '*'と '@'の違いとそれぞれの使い方を学んでください。それらをほぼ同じように使用する必要があります。 '$ 3'が改行(' \ n')を含んでいれば、デフォルトの '$ IFS'変数を持っていれば空白に置き換えられます。 – Zenexer

121

あなたも/bin/shに機能するソリューションをしたい場合は

shift [n]

first_arg="$1" 
shift 
echo First argument: "$first_arg" 
echo Remaining arguments: "[email protected]" 
を試すには、位置パラメータ のn回をシフトします。 shiftは、の値を $2の値に設定し、 $2の値を $3の値に設定します。以下同様に、 $#の値を1だけ小さくします。

+21

+1:シフトする前に$ 1を変数に保存するべきでしょう。 –

+3

驚いたことに 'foo = shift'は私が期待していることをしません。 –

+0

これは古いですが、 'foo = $(shift)'を試してください –

関連する問題