zshでは望ましい有効な結果が得られましたが、bashでは得られませんでした。何が欠けていますか?文字列を単語に分割しようとしています。
吹く
bash-3.2$ echo ${$(echo "Hello World")[@]}
bash: ${$(echo "Hello World")[@]}: bad substitution
zshrc
> echo ${$(echo "Hello World")[@]}
Hello World
答え1
Bashはそのような入れ子になった置換を実行しませんが、zshは実行します。これは非常に似ています。
$ zsh -c 'a=abcdef; echo ${${a%ef}#ab}'
cd
$ bash -c 'a=abcdef; echo ${${a%ef}#ab}'
bash: ${${a%ef}#ab}: bad substitution
解決策は一時変数を使用することです。
$ tmp=($(echo "Hello World"))
$ printf "%s\n" "${tmp[@]}"
Hello
World
注意してください。
"$@"
通常、または前後に引用符を追加する必要があります"${foo[@]}"
。それ以外の場合、拡張時に単語の分離が実行されます。割り当て中にすでにトークン化されているので、ここでは重要ではありませんが、通常は配列にとって重要です。- 割り当てで引用されていない拡張は、ファイル名のグロービングの影響も受けます。
echo
すべての引数をスペースで連結するので、単語分割結果を表示するための良いツールではありません。したがって、引数に空白があるのか、echo
空白が追加されているのか(echo "foo bar" doo
同じ出力があるかどうかecho foo bar doo
)は確認できません。