Linux экранирование двойных кавычек

Глава 5. Кавычки

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

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

Примечательно, что «не окавыченный» вариант команды grep [Пп]ервая *.txt будет правильно исполняться в Bash, но не в tcsh.

Вообще, желательно использовать двойные кавычки ( » » ) при обращении к переменным. Это предотвратит интерпретацию специальных символов, которые могут содержаться в именах переменных, за исключением $ , ` (обратная кавычка) и \ (escape — обратный слэш). [1] То, что символ $ попал в разряд исключений, позволяет выполнять обращение к переменным внутри строк, ограниченных двойными кавычками ( «$variable»), т.е. выполнять подстановку значений переменных (см. Пример 4-1, выше).

Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. [2] Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы — разделители.

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

Пример 5-1. Вывод «причудливых» переменных

Одиночные кавычки ( ‘ ‘ ) схожи по своему действию с двойными кавычками, только не допускают обращение к переменным, поскольку специальный символ «$» внутри одинарных кавычек воспринимается как обычный символ. Внутри одиночных кавычек, любой специальный символ, за исключением ‘ , интерпретируется как простой символ. Одиночные кавычки ( «строгие, или полные кавычки» ) следует рассматривать как более строгий вариант чем двойные кавычки ( «нестрогие, или неполные кавычки» ).

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

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

С отдельными командами и утилитами, такими как echo и sed, экранирующий символ может применяться для получения обратного эффекта — когда обычные символы при экранировании приобретают специальное значение.

Специальное назначение некоторых экранированных символов

используемых совместно с echo и sed \n

Источник

Кавычки

Кавычки, обрамляющие строку, предотвращают интерпретацию специальных символов, которые могут находиться в строке. Символ называется «специальным», если он не только означает самого себя но и имеет дополнительное значение для программ, например символ шаблона — *.
В этом примере, символ «*», интерпретируется как шаблон:

А тут просто как символ «звездочка», естественно команда ls, не находит такого файла:

Имейте в виду, многие программы в передаваемых им параметрах, используют специальные символы, в этом случае нужно заключать их в кавычки, что-бы системная оболочка их не трогала, оставляя для вызываемой программы.
В примере ниже, производится поиск в файлах, начинающихся на символы B или b в текущем рабочем каталоге, строк, начинающихся с символов T или t. Команда grep, получает в качестве параметра шаблон, если не заключить его в кавычки, он будет интерпретирован оболочкой, до того как попадет к grep, и ничего найдено не будет:

При обращении к переменным, желательно использовать двойные кавычки. Это позволит не интерпретировать специальные символы, содержащиеся в именах переменных, за исключением символов $, ` ( обратная кавычка) и \ ( обратный слэш ). То что символ $ является исключением, позволяет производить подстановку переменных в строке , то есть сценарий:

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

Результат обеих команд echo, будет одинаков, но только на первый взгляд:

Заключать в кавычки аргументы команды echo, нужно только если разбиение вывода на слова, вызывает какие-то трудности.

Пример вывода необычных переменных:

Одиночные кавычки (‘ ‘), по своему действию схожи с двойными кавычками, но не разрешают внутри себя подстановку переменных, интерпретируя символ «$», как обычный символ. Любой символ внутри одинарных кавычек, за исключением символа одинарной кавычки, воспринимается как обычный символ.
Одинарные кавычки являются более строгим вариантом двойных кавычек.

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

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

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

Специальное назначение экранированных символов в echo и sed

Поведение символа «\» ( обратный слэш ), зависит от разных факторов, таких как: экранирован-ли он, заключен-ли в кавычки, используется в подстановке команд или в конструкции «вложенный документ».

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

Данный сценарий вернет сообщение об ошибке:

Фактически, в данном примере, экранируется символ перевода строки, в итоге команда получается такой var=echo «$var».

Экранирование пробелов в командной строке объединяет все аргументы в один, например команда:

вернет листинг каталогов /etc и /root, а вариант

вернет «No such file or directory», поскольку фактически мы сказали команде ls вывести листинг каталога /etc/root, которого не существует.

Очень часто символ экранирования \ ( обратный слэш ), используется для ввода из командной строки многострочных команд, экранируя символ новой строки:

Приведенная команда копирует содержимое одной директории в другую, записана в 2 строки.
Другой вариант той-же операции:

Вообще если одна из строк многострочной команды заканчивается символом конвейера » | «, экранировать символ новой строки не обязательно, это просто считается хорошим тоном, и применимо только к оболочке bash, например в csh это не работает.

Источник

Кавычки в bash

Оболочка распознает четыре типа знаков кавычек:

  • знак одиночной кавычки
  • знак двойной кавычки
  • знак обратного слэша
  • знак обратной кавычки

Одиночные кавычки

Чаще всего используются для объединения в единый элемент последовательности символов, включая пробелы. Рассмотрим пример:

Чтобы вывести сведения о конкретном абоненте, достаточно выполнить команду:

Было найдено два абонента. Попробуем уточнить поиск:

Это не работает. Проблема в том, что в оболочке пробелы служат для разделения аргументов команды. Команда grep интерпретирует первый аргумент как шаблон для поиска, а все остальные — как имена файлов для поиска. Теперь попробуем так:

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

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

Во втором случае показано, что при подстановке значения пременной text оболочка интерпретирует * как указание на подстановку имен файлов из текущей директории. Чтобы избежать этого, надо делать так:

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

Двойные кавычки действуют таким же образом, как и одиночные, за исключением того, что они в меньшей стапени защищают свое содержимое. Если одиночные кавычки предписывают оболочке игнорировать все заключенные в них специальные символы, то двойные кавычки — игнорировать бо́льшую их часть. В частности, следующие три символа не игнорируются в двойных кавычках:

  • знак $
  • знак обратной кавычки
  • знак обратного слэша

Тот факт, что знак $ не игнорируется в двойных кавычках, означает, что вместо имени переменной оболочка подставляет значение этой переменной:

В последнем случае двойные кавычки предписывают оболочке подставить вместо имени переменной ее значение (символ * ). Но поскольку подстановка имен файлов не выполняется в двойных кавычках, то символ * передается команде echo как отображаемое значение.

Рассмотрим еще один пример, нагладно демонстрирующий, чем отстутствие кавычек отличается от наличия двойных кавычек:

Оболочка ужаляет символы прообела, табуляции и новой строки (т.е. все пробельные символы) из командной строки, а затем разделяет ее на аргументы, прежде чем передать их запрашиваемой команде. Поэтому при выводе значения переменной $address без кавычек, оболочка удалила символ новой строки. А затем передала команде echo девять аргументов.

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

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

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

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

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

Подстановка команд

Оболочка имеет возможность заменить указанную команду результатом ее выполнения в любом месте командной строки. Выполнить подстановку можно двумя способами: заключив команду в обратные кавычки или использовать конструкцию $(…) .

Источник

Использование строк

Мы уже знаем как работает развертывание строк. Нам также известно, что при развертывании строки, мы можем получить несколько разных строк. Например, при развертывании подстановки по шаблону, подстановка будет заменена на список файлов, каждый из которых будет передан команде в виде отдельного аргумента.

А что если нам нужно передать аргумент, содержащий символы пробела и переноса строк? Рассмотрим простой пример. Воспользуемся командой cal для вывода календаря.

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

Теперь подставим результат при помощи развертывания в команду echo, которая выводит каждый переданный ей аргумент.

Результат выглядит не так красиво. Мы потеряли все переносы строк и «лишние» пробелы.

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

Рассмотрим второй пример.

Мы потеряли символ валюты и первую цифру нашей «суммы покупки». Здесь сработало развертывание переменных. Но ведь нам же может понадобится вывести символ доллара. Так как же быть? Выход есть.

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

Экранирование символов

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

Чтобы использовать специальные символы, их можно экранировать специальным символом «\» (обратная косая черта).

В этот раз в строке все наши пробелы и остались, а символ валюты не был воспринят развертывание переменной. При вводе команды в конце первой строки (перед нажатием Enter) мы поставили символ экранирования, поэтому Linux Shell не стал исполнять команду сразу, а предложил ее продолжить на второй строке. Это очень удобно при написании длинных инструкций (например, команда с множеством аргументов). Мы можем разбить строку на несколько в нужных нам местах, что сделает команду читаемой. В основном данный прием используется при написании Shell скриптов. Очень важно сделать его читаемым и понятным, чтобы в будущем не тратить время пытаясь вспомнить, что мы написали.

Но как же быть с развертыванием? Например, если мы желаем, чтобы результат развертывания был воспринят единым аргументом? И для этого есть простое решение 🙂

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

Если строку или ее часть поместить в двойные кавычки, то все пробелы и переносы строк внутри будут сохранены.

Источник

Читайте также:  Mac os sshd start
Оцените статью