двойные кавычки в расширении параметров Zsh - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть два теста в 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 голосов
/ 11 января 2019

После некоторого эксперимента я чувствую, что могли быть применены следующие правила

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>
    

    в кавычках $() выдает одну строку

Sec2.присвоение скаляру

  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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...