【问题标题】:double quotes in zsh parameter expansionzsh参数扩展中的双引号
【发布时间】:2018-12-31 03:34:34
【问题描述】:

我在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,导致差异的原因是什么?

【问题讨论】:

    标签: zsh double-quotes parameter-expansion


    【解决方案1】:

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

    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>
      

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

    第二节。分配给标量

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2013-03-05
      • 2014-06-19
      • 1970-01-01
      • 2018-01-01
      相关资源
      最近更新 更多