zsh 参数扩展中的双引号

double quotes in zsh parameter expansion

我在 zsh

中有两个测试用例
  1. 一个。没有引号

    ~$ y=(${(f)$(echo -e "a b\nc d")}); printf "<%s>\n" "${y[@]}"
    <a b c d>
    
  2. 乙。带引号

    ~$ y=(${(f)"$(echo -e "a b\nc d")"}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    

但是,如果我首先将 echo 的输出分配给一个变量,引号没有任何作用:

  1. C。没有引号

    ~$ x=$(echo -e "a b\nc d"); y=(${(f)${x}}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    
  2. D.带引号

    ~$ x=$(echo -e "a b\nc d"); y=(${(f)"${x}"}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    

问题:

  1. 比较A和B,是什么造成了差异?
  2. 比较A和C,是什么造成了差异?

经过一些实验,我觉得可能应用了以下规则

第 1 节。直接使用

  1. 一个。没有引号

    ~$ y=(${(f)$(echo -e "a b\nc d")}); printf "<%s>\n" "${y[@]}"
    <a b c d>
    

    unquoted $() 生成被 IFS 拆分的单词:参见 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Command-Substitution

  2. 乙。带引号

    ~$ y=(${(f)"$(echo -e "a b\nc d")"}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    

    引用 $() 生成单个字符串

第二节。分配给标量

  1. C。没有引号

    ~$ x=$(echo -e "a b\nc d"); y=(${(f)${x}}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    

    分配给标量时,它会自动引用

  2. D.带引号

    ~$ x=$(echo -e "a b\nc d"); y=(${(f)"${x}"}); printf "<%s>\n" "${y[@]}"
    <a b>
    <c d>
    

    分配给标量时,它会自动引用

第三节。赋值给数组

y=($(echo -e "a b\nc d"))

关注 Sec1 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Command-Substitution