![如何在bash中按空格分割表达式?](https://linux22.com/image/158648/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E4%B8%AD%E6%8C%89%E7%A9%BA%E6%A0%BC%E5%88%86%E5%89%B2%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F.png)
我在 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
)。