Поиск по сайту:
Если у вас есть слезы, приготовьтесь пролить их (В. Шекспир).

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

04.09.2021
Bash Heredoc

Вы часто будете использовать кавычки в командной строке Linux. Работа с пробелами в имени файла? Вы используете кавычки. Работа со специальными символами? Вы снова используете кавычки.

Кавычки — это «особая функция» оболочки Linux, которая может сбивать с толку, особенно если вы новичок в командах Linux и сценариях оболочки.

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

Есть четыре разных типа символов кавычек:

  • Одиночная кавычка ‘
  • Двойная кавычка «
  • Обратная косая черта \
  • Обратная цитата `

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

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

 

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

Одиночная кавычка в 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.

Читать  Используйте файл конфигурации SSH для управления SSH-подключениями к различным удаленным серверам

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

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?

 

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

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

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

 

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

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!"

 

3. Обратная косая черта

Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» предыдущий символ.

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

andreyex@destroyer:~$ var=variable
andreyex@destroyer:~$ echo \var
var
andreyex@destroyer:~$ echo $var
variable
andreyex@destroyer:~$ echo \$var
$var

 

Читать  Удалить папку в Bash

Поскольку 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

 

Читать  Как использовать команду apt в Linux — примеры

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

andreyex@destroyer:~$ echo "Meal costs \$5.25"
Meal costs $5.25

 

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

 

4. Обратные цитаты

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

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

В приведенном ниже примере `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.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Евгений

Спасибо за статью.
Нашёл несколько неточностей (извините, Ctrl+Enter почему-то не сработал).

П.3  Обратная косая черта
[Оригинал] «…Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» предыдущий символ.
Это означает, что символ, за которым следует обратная косая черта, потеряет свое особое значение (если таковое имеется)…»

[Исправление] Обратная косая черта похожа на одинарные кавычки вокруг одного символа. Обратная косая черта «экранирует» СЛЕДУЮЩИЙ ПОСЛЕ НЕЁ символ.
Это означает, что символ, который следует ПОСЛЕ обратной косой черты, потеряет свое особое значение (если таковое имеется).

[Оригинал] «…Поскольку vне имеет особого значения, echo \var просто выводит var. С другой стороны, когда он используется с $var, обратная косая черта ускользает от специального значения $ и, таким образом, печатается как $varвместо значения var…»

[Исправление] Поскольку v[пробел]не имеет особого значения, echo \var просто выводит var. С другой стороны, когда ОБРАТНАЯ КОСАЯ ЧЕРТА используется с $var, ОНА ОТМЕНЯЕТ специальное значение $ и, таким образом, печатается ТЕКСТ $var[пробел]вместо значения переменной $var.

Это может быть вам интересно


Рекомендуемое
Сделали ошибку при редактировании файла с помощью Vim? Не волнуйтесь, вы…

Спасибо!

Теперь редакторы в курсе.