次のスクリプトがパッケージをインストールすることは理解していますが、どのパッケージなのかわかりません。
for package in ${d[@]};
do
rpm -ivh --quiet ${!package} >/dev/null 2>&1
何ですか${d[@]}
?
答え1
${d[@]}
arrayのすべての要素を表示しますd
。
これはまた、スクリプトを書いた人が誤って二重引用符を使用しなかったため、防御的に書かなかったことを意味します。 forループは次のように書く必要があります。
for package in "${d[@]}";
これにより、の各要素は、d
含まれている内容に関係なく、別々の単語(つまりforループの引数)に展開されます。
二重引用符がない場合、要素にはd
一般的なシェルトークン化と拡張が適用されます(たとえば、スペースを含む要素は次のように処理されます)。二つ1つではなくforループのパラメータ)。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?より詳細な説明が必要です。
これはコンテキストでは問題ありませんが(つまり、d
スペースやその他のシェルメタ文字なしでパッケージ名のみを含む場合)、すべてのシェルプログラマーにとって悪い習慣です。
の章のman bash
タイトルの下Arrays
:
参照配列のすべての要素を使用できます
${name[subscript]}
。パス名拡張との競合を防ぐには、中かっこが必要です。下付き文字がある場合、
@
または*
単語が name のすべてのメンバーに展開されます。これらの下付き文字は、単語が二重引用符で囲まれている場合にのみ異なります。単語が二重引用符で囲まれている場合は、
${name[*]}
次のように展開されます。一言 各配列メンバーの値はIFS特殊変数の最初の文字で区切られ、${name[@]}
nameの各要素は次に展開されます。別の単語。配列メンバがない場合は${name[@]}
null に展開されます。
(読みやすくするために改行を追加し、強調するために太字を追加しました)