最近では、Linuxでbashコマンド、特に文字列操作を学んでいます。と同じように宣言されたローカル変数があります${@}
。その意味は理解しています。$n
Nコマンドに指定されたコマンドライン引数。しかし、ポイントは何ですか${@}
?
与えられたコマンドは次のとおりです。
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つはスペースを含む文字列parameter1
、parameter2
最後はスペースです。a whole sentence as parameter
これはほとんどの場合、特にマーカーリストとして使用する場合(繰り返し、配列に割り当て、またはユーザー定義関数に渡す)必要です。
具体的には、シェル変数の引用とトークン化の微妙さについてさらに読むために、以下を参照することをお勧めします。