zsh参数扩展中的双引号

时间:2018-12-31 03:34:34

标签: zsh double-quotes parameter-expansion

我在zsh中有两个测试用例

  1. A。没有引号

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

    ~$ 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 个答案:

答案 0 :(得分:0)

经过一些实验,我认为可能已经应用了以下规则

Sec1。直接使用

  1. A。没有引号

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

    不加引号的$()产生的单词被IFS 分割:请参见http://zsh.sourceforge.net/Doc/Release/Expansion.html#Command-Substitution

  2. B。带引号

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

    用引号$()引出一个字符串

秒2。标量赋值

  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>
    

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

Sec3。分配给数组

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

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