Отличие кавычек в linux

Обновлено: 02.07.2024

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

Комментариям могут предшествовать пробелы (пробел, табуляция).

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

Разделитель команд. [Точка-с-запятой] Позволяет записывать две и более команд в одной строке.

Ограничитель в операторе выбора case . [Двойная-точка-с-запятой]

команда "точка" . Эквивалент команды source (см. Пример 11-18). Это встроенная команда bash.

"точка" может являться частью имени файла . Если имя файла начинается с точки, то это "скрытый" файл, т.е. команда ls при обычных условиях его не отображает.

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

Символ точка довольно часто используется для обозначения каталога назначения в операциях копирования/перемещения файлов.

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

Двойные кавычки . В строке "STRING" , ограниченной двойными кавычками не выполняется интерпретация большинства служебных символов, которые могут находиться в строке. см. Глава 5.

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

Более детальному рассмотрению темы экранирования посвящена Глава 5.

Разделитель, используемый в указании пути к каталогам и файлам. [слэш] Отделяет элементы пути к каталогам и файлам (например /home/bozo/projects/Makefile).

Подстановка команд. [обратные кавычки] Обратные кавычки могут использоваться для записи в переменную команды `command` .

пустая команда. [двоеточие] Это эквивалент операции "NOP" ( no op, нет операции). Может рассматриваться как синоним встроенной команды true. Команда " : " так же является встроенной командой Bash, которая всегда возвращает "true" ( 0 ).

Символ-заполнитель в условном операторе if/then:

Как символ-заполнитель для оператора вложенного документа. См. Пример 17-9.

В комбинации с оператором > (оператор перенаправления вывода), усекает длину файла до нуля. Если указан несуществующий файл -- то он создается.

В комбинации с оператором >> -- оператор перенаправления с добавлением в конец файла и обновлением времени последнего доступа ( : >> new_file). Если задано имя несуществующего файла, то он создается. Эквивалентно команде touch.

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

Символ " : " может использоваться как разделитель полей в /etc/passwd и переменной $PATH.

инверсия (или логическое отрицание) используемое в условных операторах. Оператор ! инвертирует код завершения команды, к которой он применен. (см. Пример 6-2). Так же используется для логического отрицания в операциях сравнения, например, операция сравнения "равно" ( = ), при использовании оператора отрицания, преобразуется в операцию сравнения -- "не равно" ( != ). Символ ! является зарезервированным ключевым словом BASH.

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

Кроме того, из командной строки оператор ! запускает механизм историй Bash (см. Приложение F). Примечательно, что этот механизм недоступен из сценариев (т.е. исключительно из командной строки).

символ-шаблон. [звездочка] Символ * служит "шаблоном" для подстановки в имена файлов. Одиночный символ * означает любое имя файла в заданном каталоге.

В регулярных выражениях токен * представляет любое количество (в том числе и 0) символов.

арифметический оператор. В арифметических выражениях символ * обозначает операцию умножения.

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

Оператор проверки условия. В некоторых выражениях символ ? служит для проверки выполнения условия.

В конструкциях с двойными скобками, символ ? подобен трехместному оператору языка C. См. Пример 9-28.

сивол-шаблон. Символ ? обозначает одиночный символ при подстановке в имена файлов. В регулярных выражениях служит для обозначения одиночного символа.

Символ $ , предшествующий имени переменной, указывает на то, что будет получено значение переменной.

end-of-line (конец строки). В регулярных выражениях, символ "$" обозначает конец строки.

код завершения. Переменная $? хранит код завершения последней выполненной команды, функции или сценария.

id процесса. Переменная $$ хранит id процесса сценария.

группа команд.

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

Переменные, создаваемые в дочернем процессе не видны в "родительском" сценарии. Родительский процесс-сценарий, не может обращаться к переменным, создаваемым в дочернем процессе.

инициализация массивов.

Фигурные скобки.

Команда интерпретируется как список команд, разделенных точкой с запятой, с вариациями, представленными в фигурных скобках. [1] При интерпретации имен файлов (подстановка) используются параметры, заключенные в фигурные скобки.

Использование неэкранированных или неокавыченных пробелов внутри фигурных скобок недопустимо.

file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

Блок кода. [фигурные скобки] Известен так же как "вложенный блок" , эта конструкция, фактически, создает анонимную функцию. Однако, в отличии от обычных функций, переменные, создаваемые во вложенных блоках кода, доступны объемлющему сценарию.

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

Пример 3-1. Вложенные блоки и перенаправление ввода-вывода

Пример 3-2. Сохранение результата исполнения вложенного блока в файл

В отличие от групп команд в (круглых скобках), описаных выше, вложенные блоки кода, заключенные в исполняются в пределах того же процесса, что и сам скрипт (т.е. не вызывают запуск дочернего процесса -- subshell). [2]

pathname -- полное имя файла (т.е. путь к файлу и его имя). Чаще всего используется совместно с командой find.

Обратите внимание на то, что символ " ; " , которым завершается ключ -exec команды find, экранируется обратным слэшем. Это необходимо, чтобы предотвратить его интерпретацию.

test.

Проверка истинности выражения, заключенного в квадратные скобки [ ]. Примечательно, что [ является частью встроенной команды test (и ее синонимом), И не имеет никакого отношения к "внешней" утилите /usr/bin/test.

test.

Проверка истинности выражения, заключенного между [[ ]] (зарезервированное слово интерпретатора).

См. описание конструкции [[ . ]] ниже.

элемент массива.

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

диапазон символов.

двойные круглые скобки.

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

См. обсуждение, посвященное конструкции (( . )) .

Конструкция scriptname >filename перенаправляет вывод scriptname в файл filename. Если файл filename уже существовал, то его прежнее содержимое будет утеряно.

Конструкция command &>filename перенаправляет вывод команды command, как со stdout, так и с stderr, в файл filename.

Конструкция command >&2 перенаправляет вывод со stdout на stderr.

Конструкция scriptname >>filename добавляет вывод scriptname к файлу filename. Если задано имя несуществующего файла, то он создается.

(command)>

<(command)

перенаправление ввода на встроенный документ.

конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку.

Конвейеры (еще их называют каналами) -- это классический способ взаимодействия процессов, с помощью которого stdout одного процесса перенаправляется на stdin другого. Обычно используется совместно с командами вывода, такими как cat или echo, от которых поток данных поступает в "фильтр" (команда, которая на входе получает данные, преобразует их и обрабатывает).

cat $filename | grep $search_word

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

А теперь попробуем объединить в конвейер команду ls -l с этим сценарием.

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

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

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

принудительное перенаправление, даже если установлен ключ noclobber option.

логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).

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

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

Пример 3-3. Запуск цикла в фоновом режиме

Команда, исполняемая в пределах сценария в фоне, может подвесить сценарий, ожидая нажатия клавиши. К счастью, это легко "лечится".

Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).

префикс ключа. С этого символа начинаются опциональные ключи команд.

COMMAND -[Option1][Option2][. ]

ls -al

sort -dfu $filename

set -- $variable

перенаправление из/в stdin или stdout. [дефис]

Обратите внимание, что в этом контексте "-" - не самостоятельный оператор Bash, а скорее опция, распознаваемая некоторыми утилитами UNIX (такими как tar, cat и т.п.), которые выводят результаты своей работы в stdout.

В случае, когда ожидается имя файла, тогда "-" перенаправляет вывод на stdout (вспомните пример с tar cf) или принимает ввод с stdin.

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

Теперь команда принимает ввод пользователя со stdin и анализирует его.

Используя передачу stdout по конвейеру другим командам, можно выполнять довольно эффектные трюки, например вставка строк в начало файла.

С помощью команды diff -- находить различия между одним файлом и частью другого:

grep Linux file1 | diff file2 -

И наконец пример использования служебного символа "-" с командой tar.

Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

Могут возникнуть конфликтные ситуации между опреатором перенаправления "-" и именами файлов, начинающимися с символа "-" . Поэтому сценарий должен проверять имена файлов и предаварять их префиксом пути, например, ./-FILENAME, $PWD/-FILENAME или $PATHNAME/-FILENAME.

Если значение переменной начинается с символа "-" , то это тоже может быть причиной появления ошибок.

предыдущий рабочий каталог. [дефис] Команда cd - выполнит переход в предыдущий рабочий каталог, путь к которому хранится в переменной окружения $OLDPWD .

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

Минус. Знак минус в арифметических операциях.

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

Плюс. Оператор сложения в арифметических операциях.

В зависимости от контекста применения, символ + может выступать как оператор регулярного выражения.

Ключ (опция). Дополнительный флаг для ключей (опций) команд.

Отдельные внешние и встроенные команды используют символ " + " для разрешения некоторой опции, а символ " - " -- для запрещения.

модуль. Модуль (остаток от деления) -- арифметическая операция.

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

домашний каталог. [тильда] Соответствует содержимому внутренней переменной $HOME.

bozo -- домашний каталог пользователя bozo, а команда ls

bozo выведет содержимое его домашнего каталога.

/ -- это домашний каталог текущего пользователя, а команда ls

/ выведет содержимое домашнего каталога текущего пользователя.

текущий рабочий каталог. Соответствует содержимому внутренней переменной $PWD.

предыдущий рабочий каталог. Соответствует содержимому внутренней переменной $OLDPWD.

начало-строки. В регулярных выражениях символ "^" задает начало строки текста.

изменяет поведение терминала или управляет выводом текста. Управляющий символ набирается с клавиатуры как комбинация CONTROL + <клавиша>.

Ctl-C

Завершение выполнения процесса.

Ctl-D

Выход из командного интерпретатора (log out) (аналог команды exit).

"EOF" (признак конца файла). Этот символ может выступать в качестве завершающего при вводе с stdin.

Ctl-G

Ctl-H

Backspace -- удаление предыдущего символа.

Ctl-J

Ctl-L

Перевод формата (очистка экрана (окна) терминала). Аналогична команде clear.

Ctl-M

Ctl-U

Стирание строки ввода.

Ctl-Z

используется как разделитель команд или переменных. В качестве пробельного символа могут выступать -- собственно пробел (space), символ табуляции, символ перевода строки, символ возврата каретки или комбинация из вышеперечисленных символов. В некоторых случаях, таких как присваивание значений переменным, использование пробельных символов недопустимо.

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

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

Примечания

Интерпретатор, встретив фигурные скобки, раскрывает их и возвращает полученный список команд, которые затем и исполняет.

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

Оригинал: What's the Difference Between Single and Double Quotes in the Bash Shell?
Автор: Lowell Heddings
Дата публикации: 14 сентября 2014 г.
Перевод: А.Панин
Дата перевода: 10 ноября 2016 г.

В чем разница между одинарными и двойными кавычками в сценариях командной оболочки Bash?

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

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

Кавычки и обычный текст

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

Опытные пользователи наверняка отметят, что при желании вы также можете использовать команду mkdir Test\ Directory .

Раскрытие переменных командной оболочки

Различие между одинарными и двойными кавычками становится более важным при работе с переменными в командной строке - по умолчанию Bash будет осуществлять раскрытие переменных, таких, как $test , заключающееся в преобразовании их значений в строковый формат и их подстановке в результирующие строки. В первую очередь присвоим значение переменной:

Теперь вы можете использовать переменную в командной строке аналогичным образом, в результате чего будет выводиться строка "This is a text" :

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

в увидите ничто иное, как строку "$test" , но после замены одинарных кавычек на двойные раскрытие переменной снова будет корректно осуществляться:

После замены одинарных кавычек на двойные раскрытие переменной снова будет корректно осуществляться

Это же утверждение справедливо и в случае использования символа ` для раскрытия команд в командной строке. Например, если вам нужно использовать вывод команды pwd в рамках другой команды, вы можете использовать обратные кавычки для ее раскрытия:

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

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

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

Результат использования команды без помещения первого аргумента в кавычки

Вместо этого вы можете поместить первый аргумент в кавычки:

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

Результат использования команды по отношению к файлам с символами пробелов в именах

Так как команда unzip не позволяет использовать шаблон * , соответствующий всем файлам из директории, вам придется использовать цикл for вместо него. С этого момента все становится гораздо интереснее:

Упс! Кажется, этот прем не сработал.

Некорректный вариант команды

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

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

Разумеется, таким образом будет обрабатываться каждый из файлов с расширением .zip из текущей директории.

Давайте подведем итоги

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

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

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

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

  • Все символы интерпретируются как строчные символы.

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

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

Интерфейс командной строки системы или командная оболочка , используемая в большинстве систем Linux, носит имя bash , которое расшифровывается как Bourne again shell (название "Born again shell" - "возрожденная командная оболочка" было изменено с целью упоминания автора оригинальной командной оболочки sh Стивена Борна). Командная оболочка bash реализует возможности командных оболочек sh (оригинальная командная оболочка Стивена Борна), csh (командная оболочка Билла Джоя с поддержкой сценариев, синтаксис которых основан на синтаксисе языка программирования C), а также ksh (командная оболочка Дэвида Корна).

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

Аргументы

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

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

Удаление пробелов

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

Это полностью объясняет эквивалентность следующих четырех команд после их раскрытия средствами командной оболочки .

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

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

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

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

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

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

Команда echo и кавычки

Строки, помещенные в кавычки, могут содержать специальные обозначения символов, идентифицируемые командной echo (в случае использования команды echo -e ). В примере ниже продемонстрирована методика использования обозначения символа \n для вставки символа переноса строки, а также обозначения символа \t для вставки символа табуляции (обычно эквивалентного восьми символам пробела).

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

Команды

Внешние или встроенные команды?

Не все исполняемые командной оболочкой команды являются внешними ; некоторые из них являются встроенными . Внешние команды реализованы в форме программ, представленных отдельными бинарными файлами, которые размещены в какой-либо директории файловой системы. Многие бинарные фалы, реализующие функции внешних команд, размещаются в директории /bin или /sbin . Встроенные команды являются неотъемлемой частью самого приложения командной оболочки.

Команда type

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

Как вы можете заметить, команда cd является встроенной , а команда cat - внешней .

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

Исполнение внешних команд

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

Команда which

Команда which осуществляет поиск бинарных файлов в директории, заданной с помощью переменной окружения $PATH (переменные будут рассматриваться позднее). В примере ниже устанавливается, что cd является встроенной командой, а ls , cp , rm , mv , mkdir , pwd и which - внешними командами.

Псевдонимы команд

Создание псевдонима команды

Командная оболочка позволяет вам создавать псевдонимы команд ( aliases ). Псевдонимы команд обычно используются для создания лучше запоминающихся имен для существующих команд или для упрощения передачи параметров команд.

Сокращения команд

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

Стандартные параметры команд

Псевдонимы команд могут использоваться для передачи командам стандартных параметров. Например, ниже показана методика передачи параметра -i по умолчанию при вводе команды rm .

В некоторых дистрибутивах используются стандартные псевдонимы команд для защиты пользователей от случайного удаления файлов ('rm -i', 'mv -i', 'cp -i').

Просмотр объявлений псевдонимов команд

Вы можете передать один или несколько псевдонимов команд в качестве аргументов команды alias для вывода их объявлений. Исполнение команды без аргументов приведет к выводу полного списка используемых на данный момент псевдонимов.

Команда unalias

Также вы можете прекратить использование псевдонима команды, воспользовавшись командой unalias .

Вывод информации о раскрытии команд командной оболочкой

Вы можете активировать режим вывода информации о раскрытии команд командной оболочкой с помощью команды set -x и остановить вывод этой информации с помощью команды set +x . У вас может возникнуть потребность в использовании данной возможности как при изучении данного курса, так и в случаях, когда возникают сомнения насчет того, как командная оболочка обрабатывает переданную вами команду.

Практическое задание: команды и аргументы

1. Сколько аргументов передается с помощью данной строки команды (не считая самой команды)

2. Является ли команда tac встроенной?

3. Существует ли действующий псевдоним команды rm ?

4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .

5. Выполните команду: alias rm='rm -i' . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?

6. Выведите список используемых на данный момент псевдонимов команд.

7a. Создайте псевдоним команды 'city', позволяющий вывести название вашего города.

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

8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.

9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .

10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.

11. Удалите созданный ранее псевдоним команды city.

12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?

15. Выведите строку "A B C" с двумя пробелами между буквами B и C.

16 (Необязательное задание). Создайте команду (без использования символов пробелов) для формирования следующего вывода: 17. Используйте команду echo для формирования следующего вывода:

Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).

18. Используйте одну команду echo для вывода трех слов в трех строках.

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

1. Сколько аргументов передается с помощью данной строки команды (не считая самой команды)

Ответ: три аргумента

2. Является ли команда tac встроенной?

3. Существует ли действующий псевдоним команды rm ?

4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .

5. Выполните команду: alias rm='rm -i' . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?

6. Выведите список используемых на данный момент псевдонимов команд.

7a. Создайте псевдоним команды 'city', позволяющий вывести название вашего города.

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

8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.

9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .

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

10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.

11. Удалите созданный ранее псевдоним команды city.

12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?

После интерпретации команды echo командной оболочкой будет задействована встроенная реализация команды echo . Ввод команды /bin/echo приведет к исполнению бинарного файла echo , расположенного в директории /bin .

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

(Параметр -n может не работать в командной оболочке Korn shell).

15. Выведите строку "A B C" с двумя пробелами между буквами B и C.

16 (Необязательное задание). Создайте команду (без использования символов пробелов) для формирования следующего вывода: Решение заключается в использовании символов табуляции с помощью специального обозначения \t. 17. Используйте команду echo для формирования следующего вывода:

Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).

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

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

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

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

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

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

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

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

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

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

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

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

перевод строки (новая строка)

ASCII-символ с кодом 0xx в восьмеричном виде)

Пример 5-2. Экранированные символы

символ доллара (если за комбинацией символов \$ следует имя переменной, то она не будет разыменована)

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

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

Экранирование пробелов предотвращает разбиение списка аргументов командной строки на отдельные аргументы.

Кроме того, escape -символ позволяет писать многострочные команды. Обычно, каждая команда занимает одну строку, но escape -символ позволяет экранировать символ перевода строки , в результате чего одна команда может занимать несколько строк.

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

Примечания

Не менее любопытно поведение символа "\" , употребляемого внутри двойных кавычек.

(Спасибо Wayne Pollock за пояснения.)

"Разбиение на слова" , в данном случае это означает разделение строки символов на некоторое число аргументов.

Читайте также: