Bashで式をスペースに分割する方法は?

Bashで式をスペースに分割する方法は?

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)は確認できません。

おすすめ記事