包含多个单词的 Zsh 字符串变量必须分配给一个数组

包含多个单词的 Zsh 字符串变量必须分配给一个数组

如何将包含由空格分隔的多个单词的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 )

相关内容