Разница между " " и "в bash

Я пытаюсь понять, в чем разница между " " и " ".

Когда я использую их с echo они оба дают одинаковый результат,

sps@sps-Inspiron-N5110:~$ echo Hello    world
Hello world
sps@sps-Inspiron-N5110:~$ echo "Hello   world"
Hello   world
sps@sps-Inspiron-N5110:~$ echo 'Hello   world'
Hello   world
sps@sps-Inspiron-N5110:~$ 

Есть ли конкретная ситуация, когда нам нужно использовать один или другой?

Благодарю.

2 ответа

Решение

В bash (интерактивная оболочка Ubuntu по умолчанию) все, что следует после открытой одинарной кавычки (') цитируется буквально, до следующего ' который принимается за заключительную цитату. Напротив, несколько видов расширений оболочки выполняются в двойных кавычках (").

  • Расширение параметра$... или же ${...}):

    ek@Io:~$ echo '$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}'
    $HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}
    ek@Io:~$ echo "$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}"
    /home/ek EK /bin/
    

    Это общий случай использования " цитаты в сценариях оболочки. В частности, вы, возможно, видели циклы, которые перебирают имена файлов, расширяя переменную внутри двойных кавычек, чтобы она расширялась, но ее значение не разбивалось на отдельные слова. Например, команда, подобная этой, может помочь мне отслеживать вещи при подготовке большого количества медиа-файлов для перемещения:

    ek@Io:~$ for d in to\ *; do ls -ld "$d"; du -sh "$d"; done
    drwxr-x--- 856 ek ek 32768 Mar 29 10:47 to Albums (partial)
    308G    to Albums (partial)
    drwxrwxr-x 1191 ek ek 40960 Mar 11 12:56 to Books
    21G to Books
    
  • Подстановка команд$(...) или же `...`) и арифметическое расширение$((...))):

    ek@Io:~$ echo '$(date)      `uname -r`      $((2+2))'
    $(date)      `uname -r`      $((2+2))
    ek@Io:~$ echo "$(date)      `uname -r`      $((2+2))"
    Sat Apr  4 20:42:37 EDT 2015      3.19.0-11-generic      4
    
  • Избегая одиночных персонажей с \ поддерживается и может быть удобно в " цитаты, но не поддерживается (и, как правило, было бы бессмысленно) в более простом ' цитаты:

    ek@Io:~$ echo '$HOME \$HOME \\\\'
    $HOME \$HOME \\\\
    ek@Io:~$ echo "$HOME \$HOME \\\\"
    /home/ek $HOME \\
    
  • Расширение истории с ! (если включено, что обычно происходит при интерактивном использовании оболочки):

    ek@Io:~$ # this is just a comment (but I could run a command here)
    ek@Io:~$ echo '!!'
    !!
    ek@Io:~$ # this is just another comment (but could be another command)
    ek@Io:~$ echo "!!"
    echo "# this is just another comment (but could be another command)"
    # this is just another comment (but could be another command)
    

Кроме того, одной из наиболее распространенных причин использования двойных кавычек является простое и интуитивно понятное цитирование текста, содержащего одинарные кавычки (поскольку ' не имеет никакого особого значения, внутри " цитаты):

ek@Io:~$ echo "We'll have the dog's fleas gone soon, you'll see."
We'll have the dog's fleas gone soon, you'll see.

Наконец, хотя вы не можете избежать ' внутри ' в кавычках, вы можете достичь того же результата, заканчивая ', используя сбежавший ' (\') и возобновить цитирование с ':

ek@Io:~$ echo '"My $PATH ain'\''t what it used to be," said the stevedore'\''s apprentice.'
"My $PATH ain't what it used to be," said the stevedore's apprentice.

Ссылка stackoverflow, опубликованная выше bodhi.zazen, отвечает на этот вопрос.

Ниже приведена одна ситуация, где это имеет значение.

sps@sps-Inspiron-N5110:~$ echo "Hello, I have only $((3+5)) $ in my account"
Hello, I have only 8 $ in my account
sps@sps-Inspiron-N5110:~$ echo 'Hello, I have only $((3+5)) $ in my account'
Hello, I have only $((3+5)) $ in my account
sps@sps-Inspiron-N5110:~$ 

Публикация этого ответа, просто чтобы другие знали, что я уже получил ответ. (Я разместил этот вопрос.)

Благодарю.

Другие вопросы по тегам