0

我有两个测试用例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,是什么导致了差异?
4

1 回答 1

0

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

秒1。直接使用

  1. A. 不带引号

    ~$ 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. B. 带引号

    ~$ 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

于 2019-01-11T06:03:18.690 回答