🐧 Разница между одинарными и двойными кавычками в оболочке Bash

Мануал

Вы наверняка часто используете кавычки в командной строке Linux

Имеете дело с пробелами в имени файла?

Вы используете кавычки.

Работаете со специальными символами?

Снова кавычки.

Кавычки – это “особенность” командной строки Linux, и это может сбить с толку, особенно если вы новичок в командах Linux и написании скриптов.

Далее мы объясним различные типы символов кавычек и их использование в shell-скриптах.

Существует четыре различных типа символов кавычек:

  • Одинарная кавычка ‘
  • Двойная кавычка “
  • Обратная косая черта или обратный слэш \
  • Обратная кавычка `

За исключением обратной косой черты, остальные три символа встречаются в паре.

Давайте рассмотрим их подробнее.

1. Одинарная кавычка

Одинарная кавычка в Shell игнорирует все типы специальных символов внутри.

Все, что находится между одинарными кавычками, считается одним единственным элементом.

Рассмотрим это на примере.

Вот пример текстового файла:

cat cricket 
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India

Теперь мы используем команду grep для поиска по выборке Waugh.

Это даст нам два результата:

grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia

Но если вы хотите искать только Steve Waugh, вы увидите ошибку:

grep Steve Waugh cricket
grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia

Почему?

Потому что пробел используется для разделения команды, опций и аргументов.

В приведенном выше примере в качестве первого аргумента grep принимает Steve, но Waugh и cricket – это файлы, в которых он должен выполнить поиск.

Поскольку файла с именем Waugh не существует, система выдает ошибку.

В то же время, он также показывает результат из файла cricket.

Именно здесь на помощь приходят кавычки.

Когда вы заключаете аргументы в кавычки, они интерпретируются как единое целое.

$ grep 'Steve Waugh' cricket
Steve Waugh, Australia

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

Игнорирование всех специальных символов

Все специальные символы теряют свое значение, если они заключены в одинарные кавычки.

Рассмотрим это на примерах.

Давайте объявим переменную в шелле.

Если вы повторите имя переменной с помощью $, система покажет значение переменной.

$ var=my_variable
$ echo $var
my_variable

Но если вы заключите ее в одинарные кавычки, $ потеряет свою особую силу.

$ echo '$var'
$var

2. Двойные кавычки

Двойные кавычки работают почти так же, как и одинарные.

Почти, потому что они также игнорируют все специальные символы, кроме:

  • Знаки доллара $
  • Обратные кавычки `
  • Обратные косые черты \

Поскольку знак доллара не игнорируется, можно ожидать, что имя переменной будет заменено ее значением.

Чего нельзя сказать об одинарных кавычках.

$ var=my_variable
$ echo "$var"
my_variable
$ echo '$var'
$var

Двойные кавычки можно использовать для скрытия одинарных кавычек от оболочки.

$ var=My 'own villa' is yellow
own villa: command not found
$ var="My 'own villa' is yellow"
$ echo $var
My 'own villa' is yellow

Аналогично, вы можете использовать одинарные кавычки, чтобы скрыть от оболочки двойные.

$ var=he said, "Awesome!"
said,: command not found
$ var='he said, "Awesome!"'
$ echo $var
he said, "Awesome!"

3. Обратный слэш

Обратная косая черта – это как одинарные кавычки вокруг одного символа.

Обратная косая черта “экранирует” символ, перед которым она поставлена.

Это означает, что символ, за которым следует обратная косая черта, теряет свое специальное значение (если таковое имеется).

~$ var=variable
~$ echo \var
var
~$ echo $var
variable
~$ echo \$var
$var

Поскольку v не имеет специального значения, echo \var просто выводит var.

С другой стороны, когда он используется с $var, обратная косая черта скрывает специальное значение $, и поэтому вместо значения var выводится $var.

Продолжение строки с помощью обратной косой черты

Вы заметите еще одно практическое использование символа обратной косой черты – продолжение одной команды в нескольких строках.

Когда команда слишком длинная или представляет собой комбинацию команд, на некоторых сайтах можно увидеть использование обратной косой черты для отображения одной команды более чем в одной строке.

Это делает команду/код более читаемым.

Возьмем, к примеру, эту длинную команду.

docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest

Одна и та же команда может быть разбита на несколько строк благодаря обратным слешам.

docker run --name server --network net \
-v html:/usr/share/nginx/html \
-v $PWD/custom-config.conf:/etc/nginx/nginx.conf \
-p 80:80 --restart on-failure -d nginx:latest

Это та же команда, только немного проще для понимания.

Обратный слэш внутри двойных кавычек

Обратная косая черта – один из трех специальных символов, который сохраняет свое особое значение наряду со знаком доллара и обратными кавычками.

Таким образом, вы можете использовать обратную косую черту, чтобы избежать специального значения знака доллара, двойных кавычек и обратных кавычек в двойных кавычках.

В приведенном ниже примере $5 рассматривается как переменная, которая не объявлена и, следовательно, не имеет значения.

Поэтому она игнорируется при выводе команды echo.

$ echo "Meal costs $5.25"
Meal costs .25

Чтобы использовать этот $ без интерпретации его как значения переменной, его нужно экранировать с помощью /.

~$ echo "Meal costs \$5.25"
Meal costs $5.25

Здесь обратная косая черта (\) интерпретируется для своей суперспособности, которая заключается в том, чтобы скрыть специальное значение последующего символа.

4. Обратная ковычка

Последние в этом списке – обратные кавычки, и они имеют особое значение.

Они используются для подстановки команд.

В оболочке shell есть функция подстановки команд, когда указанная команда заменяется выводом этой команды.

В приведенном ниже примере команда `date` заменяется выводом команды date, показывающей текущую дату и время в системе Linux.

$ echo The current date and time is `date`
The current date and time is Monday 23 August 2021 04:55:18 PM IST

Следует помнить, что замена будет происходить только в том случае, если между обратными кавычками находится команда.

В противном случае она будет отображаться как есть.

$ echo 'The current date and time is `late`'
The current date and time is `late`

Опять же, двойные кавычки интерпретируют обратные кавычки, но одинарные кавычки игнорируют их особое значение.

Обратные кавычки больше не рекомендуются

В течение многих лет обратные кавычки использовались для подстановки команд в скриптах Shell.

Но в наши дни современные системы UNIX и Linux предпочитают использовать конструкцию $(command).

$ echo The current date and time is $(date)
The current date and time is Monday 23 August 2021 05:55:47 PM IST

Не отставайте от времени и перестаньте использовать обратные кавычки.

Надеюсь, теперь вы лучше понимаете, что такое кавычки в Linux и shell.

Пожалуйста, оставляйте свои предложения и вопросы в разделе комментариев.

Спонсор данной статьи – proxy-sale.com

Добавить комментарий