"Кавычки"

Кавычки

Кавычки, экранирование - механизм защиты специальных/обыкновенных символов оболочки от интерпретации.

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

$ echo Hit this *

Hit this 484 abb....

......................

$

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

$ echo "Hit this *"

Hit this *

$

$ STRING=may day gray

Команда 'day' не найдена, возможно вы имели в виду:

Команда 'say' из пакета 'gnustep-gui-runtime' (universe)

Команда 'dar' из пакета 'dar' (universe)

Команда 'dat' из пакета 'liballegro4-dev' (universe)

Команда 'jay' из пакета 'mono-jay' (universe)

Команда 'dan' из пакета 'emboss' (universe)

Команда 'dab' из пакета 'bsdgames' (universe)

Команда 'dav' из пакета 'dav-text' (universe)

day: команда не найдена

$

$ STRING="may day gray"

$ echo $STRING

may day gray

$

Вообщем можно сказать: кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке (Символ называется "специальным", если он несет дополнительную смысловую нагрузку, например символ шаблона - *).

При использовании кавычек желательно следовать двум правилам:

  • Всегда применяйте двойные кавычки при выводе на экран строк командой echo.

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

Использование кавычек интерпретатором shel

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

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

Двойные кавычки применяются, когда необходимо буквальное восприятие всех символов, за исключением символов: $,', \. Символы доллара, обратной кавычки и символ обратной косой черты сохраняют свое специальное значение при функционировании интерпретатора shell. Если при выводе на экран переменной присваивается текстовая строка, заключенная в двойные кавычки, речь идет о выводе на экран самой переменной, то есть сведения присваиваются (в случае переменных) или выводятся ¨ как есть¨ :

Команду содержащую пробелы следует заключить в кавычки и тогда интерпретатор проигнорирует пробелы, воспользуемся командой grep для поиска имени Davey Wire. Если не применять кавычки, команда grep воспримет Davey как строку для поиска, a Wire — как файл.

$ grep Davey Wire /etc/passwd

grep: Wire: Нет такого файла или каталога

$

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

$ BOY=nobody

$ echo "The $BOY did well"

The nobody did well

$ echo "The $BOY did well"

The nobody did well

$ echo "The "$BOY" did well"

The nobody did well

$

В приведенном выше примере написание кавычек ЖЕЛАТЕЛЬНО , однако если тоже самое сделать без кавычек результат тот же:

$ BOY=nobody

$ echo The $BOY did well

The nobody did well

$

Все зависит от самого интерпретатора, алгоритмов которыми он "парсит" строку, от настроек его профиля и тд..., во избежании ошибок кавычки лучше не забывать.

Одинарные кавычки —  апострофы

Применение одинарных кавычек во многом аналогично применению двойных кавычек. Интерпретатор shell получает указание не выполнять подстановку этих значений; другими словами, символы, заключенные в такие кавычки, лишены специального значения. То, что заключено в одинарные кавычки, воспринимается буквально.Одиночные кавычки (' ') схожи по своему действию с двойными кавычками, только не допускают обращение к переменным, поскольку специальный символ $ внутри одинарных кавычек воспринимается как обычный символ. Внутри одиночных кавычек, любой специальный символ, за исключением ', интерпретируется как простой символ. Одиночные кавычки ("строгие, или полные кавычки") следует рассматривать как более строгий вариант чем двойные кавычки ("нестрогие, или неполные кавычки"). Можно сказать и так: одинарные кавычки(' ') и двойные кавычки(" ") отличаются лишь тем, что двойные не интерпретируют символ $, то есть вы можете использовать переменные в своей строке. Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. Заключенные в кавычки слова будут восприниматься как один параметр.

$ echo ""bash""

bash

$ echo '"bash"'

"bash"

echo "'bash'"

'bash'

$ echo ''bash''

bash

$

$ echo '"' "'"

" '

$ echo '"' "'" """"

" '

$ echo '"' "'" """" '""'

" ' ""

$ между кавычками апостроф обычный символ, но кавычки между кавычками убираются

Обратные кавычки

Обратные кавычки позволяют присваивать переменным данные вывода системных команд. Символы, заключенные в обратные кавычки, воспринимаются интерпретатором shell как системная команда, которую следует выполнить. С помощью этого метода можно осуществить подстановку данных вывода в переменную. Можно также комбинировать разные кавычки, как это показано далее.

$ echo date

date

$ echo `date`

Пн. авг. 10 12:36:33 MSK 2015

$

или:

$ DATE=`date`

$ echo $DATE

Пн. авг. 10 12:41:48 MSK 2015

$

Выведем на экран небольшое сообщение, включающее сведения о количестве пользователей в системе.

$ echo "There are `who | wc -l` user in system"

There are 3 user in system

$

Интерпретатор shell воспринимает обратные кавычки, рассматривает текст,(wc -l кол-во строк) который заключен в обратные кавычки, интерпретирует его и выполняет.

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

Символ обратного слэша, обратной косой черты, экранирования указывает интерпретатору shell, что следующий за ним символ не имеет ¨специального¨ значения. "Специальное значение" могут иметь такие символы: & * = ^ $ ' " | ? то есть символы несущие дополнительную смысловую нагрузку.

В результате применения команды echo вместе с символом * на экран выводится не символ звездочки, а листинг. В этот листинг включается текущий каталог.

$ echo *

484 abby account.err accounts.err accounts.out data.f data.f.save Dropbox en:download f_desc files.out file.zzz find grep.cc grep.err grepstrings loganalyzer-3.6.5 loganalyzer-3.6.5.tar.gz Mail myfile myfile1 nnn nohup.out procmail.log scripts sort.out sudo test.xxx textfile text_ls vartest webmin_1.730_all.deb Weekly who.out xmobar.config xmobarrc yes zz-11 Видео Документы Загрузки Изображения Музыка Общедоступные Рабочий стол Шаблоны

$

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

$ echo \*

*

$

Интерпретатор shell воспринимает $$ как текущий PID (ID процесса). Чтобы отключить специальное значение и вывести на экран символ $$, нужно перед этим символом поместить символ обратной косой черты:

$ echo $$

2824

$ echo \$$

$$

$

Для вывода на экран символов, заданных восьмеричными ASCII-кодами, перед ними следует размещать символ обратной косой черты. В противном случае интерпретатор shell воспримет их как обычные числа, в Linux не забывать ключ -e:

$ echo -e "This is a copyright x40 sign"

This is a copyright x40 sign

$ echo -e "This is a copyright \x40 sign"

This is a copyright @ sign

$

ASCII-коды

........и так далее и тому подобное!