Bash配列で複数の単語文字列を操作する

Bash配列で複数の単語文字列を操作する

次の簡単なスクリプトがあります。

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つの別々の単語が生成され処理されますkalilinux

だから

for name in "${names[@]}"; do
    printf '%s\n' "$name"
done

またはこの単純なスクリプトの場合

printf '%s\n' "${names[@]}"

printf(対応するフォーマット文字列は個々の引数ごとに単に再利用されるため、ループは必要ありません。)

関連:

さらに(printf変数文字列を出力するために常にこれを使用する理由):

おすすめ記事