如何在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

请注意;

  • 您通常需要在"$@"or周围添加引号"${foo[@]}",否则扩展会进行分词。这在这里并不重要,因为它在赋值时已经被分词了,但一般来说对于数组来说它确实很重要。
  • 赋值中未加引号的扩展也会受到文件名通配的影响。
  • echo不是一个很好的查看分词结果的工具,因为它将所有参数都用空格连接起来,因此您无法查看参数中是否存在空格,或者是否echo添加了空格(echo "foo bar" doo与 具有相同的输出echo foo bar doo)。

相关内容