次の簡単なスクリプトがあります。
names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
echo "names array length: ${#names[@]}"
for n in ${names[@]}; do
echo $n
done
私が意図して得たいものは次のとおりです。
names array length: 5
windows
ubuntu
raspbian
debian
kali linux
しかし、私が得た結果は次のとおりです。
names array length: 5
windows
ubuntu
raspbian
debian
kali
linux
配列内の項目数は正しいように見えますが、印刷結果は5行ではなく6行に表示されます。希望の出力をどのように取得できますか?
答え1
二重引用符変数拡張を使用${names[@]}
すると、配列要素に展開されます。一人で引用。 Unquote変数拡張を使用すると、シェルはすべての要素を空白に分割し(デフォルトで)、生成されたすべての単語に対して追加のファイル名のグロービングを実行します(使用する単語とは関係ありません)。あなたの例では、2つの別々の単語が生成され処理されますkali
。linux
だから
for name in "${names[@]}"; do
printf '%s\n' "$name"
done
またはこの単純なスクリプトの場合
printf '%s\n' "${names[@]}"
printf
(対応するフォーマット文字列は個々の引数ごとに単に再利用されるため、ループは必要ありません。)
関連:
さらに(printf
変数文字列を出力するために常にこれを使用する理由):