Вы часто будете использовать кавычки в командной строке Linux. Работа с пробелами в имени файла? Вы используете кавычки. Работа со специальными символами? Вы снова используете кавычки.
Кавычки – это «особая функция» оболочки Linux, которая может сбивать с толку, особенно если вы новичок в командах Linux и сценариях оболочки.
Мы объясним различные типы символов кавычек и их использование в сценариях оболочки.
Есть четыре разных типа символов кавычек:
За исключением косой черты, остальные три символа встречаются парами.
Давайте рассмотрим их подробнее.
Одиночная кавычка в Shell игнорирует все типы специальных символов в ней. Все, что находится в одинарных кавычках, считается одним элементом.
Возьмем это на примере. Вот образец текстового файла с некоторыми игроками в крикет 90-х годов.
andreyex@destroyer:~$ cat cricket Allan Donald, South Africa Steve Waugh, Australia Mark Waugh, Australia Henry Olonga, Zimbabwe Sachin Tendulkar, India
Теперь вы используете команду grep для поиска игроков в крикет с фамилией Waugh. Это даст вам два результата:
andreyex@destroyer:~$ grep Waugh cricket Steve Waugh, Australia Mark Waugh, Australia
Но если вы хотите найти только Steve Waugh и попытаетесь использовать его как есть, вы увидите ошибку:
andreyex@destroyer:~$ grep Steve Waugh cricket grep: Waugh: No such file or directory cricket:Steve Waugh, Australia
Почему? Потому что пространство используется для разделения команды, параметров и аргумента. В приведенном выше примере он принимает Steve в качестве первого аргумента grep, но Waugh и cricket принимаются как файлы, в которых он должен выполнить поиск. Поскольку файла с именем нет Waugh, для этого выдается ошибка. В то же время он также показывает результат из файла cricket.
Здесь на помощь приходит цитата. Когда вы заключаете аргументы в кавычки, это интерпретируется как единое целое.
andreyex@destroyer:~$ grep 'Steve Waugh' cricket Steve Waugh, Australia
Обычно, когда оболочка видит первую одинарную кавычку, она игнорирует любые специальные символы (пробел также является специальным символом), пока не найдет другую одинарную кавычку (закрывающие кавычки).
Все специальные символы теряют свое значение, если они заключены в одинарные кавычки. Посмотрим на примерах.
Объявим переменную в оболочке. Если вы повторяете имя переменной с помощью $, оно показывает значение переменной.
andreyex@destroyer:~$ var=my_variable andreyex@destroyer:~$ echo $var my_variable
Но если вы заключите его в одинарные кавычки, $ потеряет свою особую силу.
andreyex@destroyer:~$ echo '$var' $var
Теперь только это. Клавиша ввода также сохраняется в одинарных кавычках.
andreyex@destroyer:~$ echo 'how are > you?' how are you?
Двойные кавычки работают почти так же, как одинарные. Почти потому, что они также склонны игнорировать все специальные символы, кроме:
Поскольку знак доллара не игнорируется, вы можете ожидать, что имя переменной будет заменено ее значением. Но это не относится к одинарным кавычкам.
andreyex@destroyer:~$ var=my_variable andreyex@destroyer:~$ echo "$var" my_variable andreyex@destroyer:~$ echo '$var' $var
Двойные кавычки можно использовать, чтобы скрыть одинарные кавычки из оболочки.
andreyex@destroyer:~$ var=My 'own villa' is yellow own villa: command not found andreyex@destroyer:~$ var="My 'own villa' is yellow" andreyex@destroyer:~$ echo $var My 'own villa' is yellow
Точно так же вы можете использовать одинарные кавычки, чтобы скрыть двойные кавычки из оболочки.
andreyex@destroyer:~$ var=he said, "Awesome!" said,: command not found andreyex@destroyer:~$ var='he said, "Awesome!"' andreyex@destroyer:~$ echo $var he said, "Awesome!"
Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» предыдущий символ.
Это означает, что символ, за которым следует обратная косая черта, потеряет свое особое значение (если таковое имеется).
andreyex@destroyer:~$ var=variable andreyex@destroyer:~$ echo \var var andreyex@destroyer:~$ echo $var variable andreyex@destroyer:~$ 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.
andreyex@destroyer:~$ echo "Meal costs $5.25" Meal costs .25
Чтобы использовать этот $ без интерпретации как значение переменной, вы должны экранировать его с помощью /.
andreyex@destroyer:~$ echo "Meal costs \$5.25" Meal costs $5.25
Здесь обратная косая черта (\) интерпретируется как суперсила, которая позволяет избежать специального значения последующего символа.
Последнее в этом списке – обратные кавычки, и оно имеет особое значение. Используется для подстановки команд.
Оболочка имеет эту функцию подстановки команд, при которой указанная команда заменяется выводом команды.
В приведенном ниже примере `date` заменяется выводом команды date, показывающим текущую дату и время в системе Linux.
andreyex@destroyer:~$ echo The current date and time is `date` The current date and time is Monday 23 August 2021 04:55:18 PM IST
Следует иметь в виду, что замена будет иметь место только в том случае, если между обратными кавычками есть команда. В противном случае он отображается как есть.
andreyex@destroyer:~$ echo 'The current date and time is `late`' The current date and time is `late`
Опять же, двойные кавычки интерпретируют обратные кавычки, но одинарные кавычки игнорируют их особое значение.
В течение многих лет обратные кавычки использовались для подстановки команд в сценариях оболочки. Но в наши дни современные системы UNIX и Linux предпочитают конструкцию $(command).
andreyex@destroyer:~$ echo The current date and time is $(date) The current date and time is Monday 23 August 2021 05:55:47 PM IST
Идите в ногу со временем и перестаньте использовать обратные кавычки.
Надеюсь, теперь вы лучше понимаете кавычки в Linux и сценарии оболочки.
Пожалуйста, оставляйте свои предложения и вопросы в разделе комментариев.
Спасибо за статью.
Нашёл несколько неточностей (извините, Ctrl+Enter почему-то не сработал).
П.3 Обратная косая черта
[Оригинал] “…Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» предыдущий символ.
Это означает, что символ, за которым следует обратная косая черта, потеряет свое особое значение (если таковое имеется)…”
[Исправление] Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» СЛЕДУЮЩИЙ ПОСЛЕ НЕЁ символ.
Это означает, что символ, который следует ПОСЛЕ обратной косой черты, потеряет свое особое значение (если таковое имеется).
…
[Оригинал] “…Поскольку vне имеет особого значения, echo \var просто выводит var. С другой стороны, когда он используется с $var, обратная косая черта ускользает от специального значения $ и, таким образом, печатается как $varвместо значения var…”
[Исправление] Поскольку v[пробел]не имеет особого значения, echo \var просто выводит var. С другой стороны, когда ОБРАТНАЯ КОСАЯ ЧЕРТА используется с $var, ОНА ОТМЕНЯЕТ специальное значение $ и, таким образом, печатается ТЕКСТ $var[пробел]вместо значения переменной $var.