Bashで${@}は何ですか? [コピー]

Bashで${@}は何ですか? [コピー]

最近では、Linuxでbashコマンド、特に文字列操作を学んでいます。と同じように宣言されたローカル変数があります${@}。その意味は理解しています。$nNコマンドに指定されたコマンドライン引数。しかし、ポイントは何ですか${@}

与えられたコマンドは次のとおりです。

local instr;
instr="${@}";

答え1

Bash(およびすべてのPOSIX様シェル)$@または${@}「特殊パラメータ」すべての位置引数(=コマンドライン引数)のリストに展開されます。$*似ている二重引用符スペースで区切られたすべての位置引数を含む文字列ではなく、個々のトークンのリストに展開されます(1)。


(1) 実際、パラメータは「空白」で明示的に連結されず、最初の文字($IFS例:入力フィールド区切り記号変数ですが、多くのシェルではデフォルトは「space」です。次のテキストでは、単純化のために「スペース」を使い続け、$IFSデフォルト値を維持するか、必要に応じて変更しますが、何をしたいのかを知っているとします。


だから、

  • "$*""$1 $2 $3 ... "「単語」と同等とみなされる一方、
  • "$@""$1" "$2" "$3" ...「複数個の単語」と同じで扱います。

引用符がない場合は、両方ともスペースで区切られた単語のリストにすぎません。以下のように、コマンドライン引数自体が空白のある文字列である場合、これらの区別が重要になります。

./my_script.sh parameter1 parameter2 "a whole sentence as parameter"
  • $*または、$@引用符なしで7つの個別のトークンのリストに展開されます。これはあなたが望むケースがほとんどありません。
  • "$*"スペースで区切られた7つの単語()parameter1 parameter2 a whole sentence as parameterで構成されるトークンに展開されます。これはほとんどの時間ですいいえあなたは何が欲しいですか?
  • "$@"3つのトークンのリストに展開されます。最初の2つはスペースを含む文字列parameter1parameter2最後はスペースです。a whole sentence as parameterこれはほとんどの場合、特にマーカーリストとして使用する場合(繰り返し、配列に割り当て、またはユーザー定義関数に渡す)必要です。

具体的には、シェル変数の引用とトークン化の微妙さについてさらに読むために、以下を参照することをお勧めします。

関連情報