シェルスクリプト内のプログラムにコマンドラインパラメーターを渡す


15

./script.sh arg1 [arg2 arg3 ...]コマンドライン引数はarg1arg2、...によって得することができ$1$2...しかし、引数の数がされないで固定します。

シェルスクリプトではarg2、プログラムから開始する引数を渡します。

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

1つ以上の引数がある可能性があるので、どうすればそれができますか?

回答:


17

通常の方法は、arg1"$1")のコピーを保存し、パラメーターを1つずつシフトすることです。そのため、リスト全体を次のように参照できます"$@"

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bashはもちろん配列をサポートしていますが、提示された質問には必要ありません。

arg1でさえオプションの場合、次のようにチェックします。

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

使用するときに二重引用符が必要$@ですか?
リー

1
の二重引用符$@は、シェルに各パラメーターを二重引用符で囲むように指示します(パラメーターに括弧やアスタリスクなどの興味深い文字が含まれている場合は便利です)。あなたはそれを気にしない場合は、プレーンな$*作品...
トーマス・ディッキー

6
@Leeはい、二重引用符が必要です。それ以外の場合、引数のリストを渡す代わりに、各引数は空白で分割され、各ピースはワイルドカードパターンとして解釈され、パターンが一致する場合、一致のリストに置き換えられます。一般的に、常に二重引用符変数の置換
ジル 'SO-悪であるのをやめる'

10

パラメーター展開を使用して位置パラメーターをスライスできます。構文は次のとおりです。

${parameter:offset:length}

length省略した場合、最後の値までと見なされます。

2番目から最後の引数に渡すには、次のものが必要です。

${@:2}

例:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.