![包含多个单词的 Zsh 字符串变量必须分配给一个数组](https://linux22.com/image/220275/%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA%E5%8D%95%E8%AF%8D%E7%9A%84%20Zsh%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%98%E9%87%8F%E5%BF%85%E9%A1%BB%E5%88%86%E9%85%8D%E7%BB%99%E4%B8%80%E4%B8%AA%E6%95%B0%E7%BB%84.png)
如何将包含由空格分隔的多个单词的Zsh字符串变量分配给数组,以便每个单词都是数组元素
s='run help behind me'
a=($s)
m=${a[0]}
n=${a[1]}
print "m=$m"
echo n=$n
m=
n=run help behind me
令人困惑,如此简单但仍然无法做到这一点..真的请帮忙
答案1
与许多 shell 相比,zsh 默认情况下在变量扩展期间不执行分词。如 中所述man zshexpn
,您可以使用=
修饰符来启用拆分:
${=spec} Perform word splitting using the rules for SH_WORD_SPLIT during the evaluation of spec, but regardless of whether the parameter appears in double quotes; if the `=' is doubled, turn it off. This forces parameter expansions to be split into separate words before substitution, using IFS as a delimiter. This is done by default in most other shells.
即a=( ${=s} )
或a=( $=s )
。另外,请记住 zsh 数组的索引是从 1 而不是 0 开始的。
那些,比如a=( $s )
of bash
¹ 根据涉及$IFS
特殊字符的复杂规则进行分割。您还可以使用以下命令根据任意给定字符串进行拆分s
参数扩展标志:
a=( ${(s[ ])s} ) # split $s on spaces only, discarding empty elements
a=( "${(@s[ ])s}" ) # split $s on spaces, preserving empty elements
也可以看看在 zsh 中扩展变量。
1 但请注意,与 相反bash
,它不会在您还需要~
运算符:的基础上进行通配a=( $=~s )
。