Внутреннее устройство Linux
Шрифт:
$ grep 'r.*t /etc/passwd'
Когда вам необходимо использовать литерал, в первую очередь следует обратиться к одинарным кавычкам, так как при этом вы будете уверены в том, что оболочка не станет пытаться выполнить какие-либо подстановки. В результате синтаксис будет довольно ясным. Тем не менее иногда может потребоваться дополнительная гибкость, и тогда вам пригодятся двойные кавычки.
11.2.3. Двойные кавычки
Двойные кавычки (") действуют подобно одинарным, за исключением того, что оболочка развертывает все переменные, которые
$ echo "There is no * in my path: $PATH"
При запуске этой команды обратите внимание на то, что оболочка выполняет подстановку для переменной $PATH, но не заменяет символ *.
примечание
Если вы используете двойные кавычки при выводе больших объемов текста, попробуйте использовать синтаксис heredoc, как описано в разделе 11.9.
11.2.4. Передача одинарной кавычки в литерале
Хитрый момент при использовании литералов в оболочке Bourne shell возникает тогда, когда необходимо передать команде одинарную кавычку как литерал. Один из способов это выполнить — поместить символ обратной косой черты перед знаком одинарной кавычки:
$ echo I don\'t like contractions inside shell scripts.
Обратная косая черта и кавычка должны располагаться вне любой другой пары одинарных кавычек, поэтому строка наподобие 'don\'t вызовет синтаксическую ошибку. Как ни странно, но можно помещать одинарную кавычку внутри пары двойных кавычек, как показано в следующем примере (результат работы этой команды такой же, как и в предыдущем примере):
$ echo "I don't like contractions inside shell scripts."
Если вы в затруднении и вам необходимо общее правило для помещения всей строки в кавычки без подстановок, воспользуйтесь такой процедурой.
1. Замените все экземпляры ' (одинарная кавычка) на '\'' (одинарная кавычка, обратная косая черта, одинарная кавычка, одинарная кавычка).
2. Заключите всю строку в одинарные кавычки.
Следовательно, такую неуклюжую строку, как this isn't a forward slash: \, можно поместить в кавычки следующим образом:
$ echo 'this isn'\''t a forward slash: \'
примечание
Стоит еще раз упомянуть о том, что при помещении строки в кавычки оболочка расценивает все, что находится внутри них, как единый параметр. Следовательно, символы a b c представляют три параметра, а символы a "b c" — только два.
11.3. Специальные переменные
Большинство сценариев оболочки понимает параметры командной строки и взаимодействует с запускаемыми командами. Чтобы перевести ваши сценарии с уровня простого перечня команд на уровень более гибких приложений для оболочки, вам необходимо знать о том, как использовать специальные переменные оболочки Bourne shell. Эти специальные переменные подобны любым другим переменным оболочки, как рассказано в разделе 2.8, за исключением
примечание
После прочтения следующих разделов вы поймете, почему в сценариях оболочки многие специальные символы присутствуют в том виде, как они написаны. Если вы пытаетесь разобраться в каком-либо сценарии оболочки и вам встречается строка, которая выглядит совершенно необъяснимо, рассмотрите ее, разбив на фрагменты.
11.3.1. Индивидуальные аргументы: $1, $2...
Переменные $1, $2, а также все переменные, названные с помощью положительных ненулевых целых чисел, содержат значения параметров сценария или аргументы. Допустим, например, что файл следующего сценария называется pshow:
#!/bin/sh
echo First argument: $1
echo Third argument: $3
Попробуйте запустить этот сценарий, как показано ниже, чтобы увидеть выводимые им аргументы:
$ ./pshow one two three
First argument: one
Third argument: three
Встроенная в оболочку команда shift может быть использована с переменными-аргументами, чтобы удалить первый аргумент ($1) и сдвинуть все оставшиеся. Конкретнее, аргумент $2 превратится в $1, $3 — в $2 и т. д. Предположим, что файл следующего сценария называется shiftex:
#!/bin/sh
echo Argument: $1
shift
echo Argument: $1
shift
echo Argument: $1
Запустите его следующим образом, чтобы понять, как он работает:
$ ./shiftex one two three
Argument: one
Argument: two
Argument: three
Как видите, сценарий shiftex выводит все три аргумента: начинает с первого, сдвигает оставшиеся и повторяет вывод.
11.3.2. Количество аргументов: $#
Переменная $# хранит количество аргументов, переданных в сценарий, и особенно важна при циклическом запуске команды shift для выбора аргументов. Если значение $# равно 0, аргументов не остается, поэтому переменная $1 пустая (см. раздел 11.6, который содержит описание циклических структур).
11.3.3. Все аргументы: $@
Переменная $@ представляет все аргументы сценария и весьма полезна для передачи их команде внутри сценария. Например, команды Ghostscript (gs) обычно длинные и сложные. Допустим вам необходимо создать шаблон команды для растрирования файла PostScript с разрешением 150 dpi, используя стандартный поток вывода, но оставив при этом также возможность для передачи других параметров в команду gs. Для этих целей можно было бы написать сценарий, подобный приведенному ниже:
#!/bin/sh
gs -q -dBATCH -dNOPAUSE -dSAFER -sOutputFile=- -sDEVICE=pnmraw $@
примечание
Если какая-либо строка в сценарии оболочки становится слишком длинной для текстового редактора, можете разбить ее с помощью символа \. Например, предыдущий сценарий можно записать таким образом:
#!/bin/sh
gs -q -dBATCH -dNOPAUSE -dSAFER \
– sOutputFile=- -sDEVICE=pnmraw $@
11.3.4. Имя сценария: $0