Я пытаюсь выяснить, в чем разница между «» и «».
Когда я использую их с 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:~$
. Есть ли какая-то конкретная ситуация, когда нам нужно использовать одну или другую?
Спасибо.
В ударе (интерактивная оболочка 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)
Кроме того, одна из наиболее распространенных причин использовать двойные кавычки состоит в том, чтобы легко и интуитивно заключить в кавычки текст, содержащий одинарные кавычки (так как a '
не имеет никакого особого значения вообще, внутри "
кавычки):
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.
Наконец, хотя Вы не можете выйти из a '
внутри '
- заключенный в кавычки текст, можно достигнуть того же результата путем окончания заключающий в кавычки с '
, использование завершенного '
(\'
), и возобновление заключения в кавычки с '
:
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, отвечает на этот вопрос.
Ниже один situtation, где это имеет значение.
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:~$
Регистрация этого ответа, только чтобы позволить другим знать, что у меня уже есть ответ. (Я отправил этот вопрос.)
Спасибо.