$ echo $STRING
MAY DAY, MAY DAY, GOING DOWN
Предположим, что сведения о системной дате присваиваются переменной с именем mydate.
$ MYDATE="date"
$ echo $MYDATE
date
Интерпретатор команд воспринимает информацию в строке "как есть", т. е. дате не присваивается специальное значение. Поэтому в качестве даты фигурирует слова data
Двойные кавычки следует применять при поиске строки, содержащей пробелы. Воспользуемся командой grep для поиска имени Davey Wire. Если не применять кавычки, команда grep воспримет Davey как строку для поиска, a Wire — как файл.
$ grep Davey Wire /etc/passwd
grep: Wire: No such file or directory
Для устранения возможных недоразумений следует заключить строку в двойные кавычки. Тогда интерпретатор команд проигнорирует пробелы. При работе с текстовыми строками следует всегда применять двойные кавычки, независимо от количества слов в строке.
$ grep "Davey Hire" /etc/passwd
davyboy:9sdJUK2s:106:Davey Wire:/home/ap
Чтобы включить переменную в строку для вывода на экран, можно применить двойные кавычки. В следующем примере интерпретатор shell выводит на экран строку, считывает знак $, трактует его как переменную и заменяет переменную $BOY значением boy.
$ ВОY="boy"
$ echo " The $BOY did well"
The boy did well
$ echo "The "$BOY" did well"
The boy did well
15.3. Одинарные кавычки
Применение одинарных кавычек во многом аналогично применению двойных кавычек. Интерпретатор shell получает указание не выполнять подстановку этих значений; другими словами, символы, заключенные в такие кавычки, лишены специального значения. То, что заключено в одинарные кавычки, воспринимается буквально. Рассмотрим пример, аналогичный примеру с двойными кавычками:
$ GIRL='girl'
$ echo "The '$GIRL' did well"
The 'girl' did well
15.4. Обратные кавычки
Обратные кавычки позволяют присваивать переменным данные вывода системных команд. Символы, заключенные в обратные кавычки, воспринимаются интерпретатором shell как системная команда, которую следует выполнить. С помощью этого метода можно осуществить подстановку данных вывода в переменную. Можно также комбинировать разные кавычки, как это показано далее.
В следующем примере интерпретатор shell пытается выполнить подстановку слова hello. Но, поскольку нет ни команды, ни сценария с таким именем, отображается сообщение об ошибке.
$ echo `hello`
sh: hello: command not found
Применим снова команду date.
$ echo `date`
Sun May 16 16:40:19 GMT 1999
Теперь команда записана правильно, и интерпретатор shell может выполнить корректную подстановку этой команды.
Присвоим переменной mydate данные вывода команды date. Ниже приводится формат команды date:
$ date +%A" the "%e" of "%B" "%Y
Sunday the 16 of May 1999
Присвоим значение переменной mydate и отобразим его.
$ mydate=`date +%A" the "%e" of "%В" "%Y`
$ echo $mydate
Sunday the 16 of May 1399
Конечно, переменной mydate можно присвоить весь вывод команды date:
$ mydate=`date`
$ echo $mydate
Sun May 16 16:48:16 GMT 1999
Ниже приводится другой пример. Обратные кавычки содержатся внутри двойных кавычек:
$ echo "The date today ls `date` "
The date today ls Sun May 16 16:56:53 GMT 1999
Выведем на экран небольшое сообщение, включающее сведения о количестве пользователей в системе.
$ echo "There are `who | wc -l` users on the system"
There are 13 users on the system
В приведенном примере выводится текстовая строка. Интерпретатор shell воспринимает обратные кавычки, рассматривает текст, который заключен в обратные кавычки, интерпретирует его и выполняет.
15.5. Обратная косая черта
Символ обратной косой черты указывает интерпретатору shell, что следующий за ним символ не имеет специального значения. Специальное значение могут иметь такие символы: & *=^ $ ` " | ?.
В результате применения команды echo вместе с символом * на экран выводится не символ звездочки, а листинг. В этот листинг включается текущий каталог.
$ echo *
conf.linuxconf conf.modules cron.daily cron.hourly cron.monthly cron.weekly crontab csh.cshrc default dosemu.conf dosemu.users exports fdprm fstab gettydefs gpm‑root.c onf group group- host.conf hosts hosts.allow hosts.deny httpd inetd
Для отмены специального значения звездочки, примените символ обратной косой черты:
$ echo \*
*
Аналогичный результат можно получить с помощью команды $$. Интерпретатор shell воспринимает ее как текущий PID (ID процесса). Чтобы отключить специальное значение и вывести на экран символ $$, нужно перед этим символом поместить символ обратной косой черты:
$ echo $$
284
$ echo \$$
$$
Для вывода на экран символов, заданных восьмеричными ASCII–кодами, перед ними следует размещать символ обратной косой черты. В противном случае интерпретатор shell воспримет их как обычные числа.
$ echo "This ls a copyright 251 sign"
This is a copyright \251 sign"
$ echo "This is a copyright \251 sign"
This ls a copyright © sign"
В Linux…
He забывайте при выводе управляющих символов указывать параметр " -e".
$ echo -e "This ls a copyright \251 sign"
This ls a copyright © sign
Если при использовании команды expr применить символ * для обозначения операции умножения, то отобразится сообщение об ошибке. Чтобы символ * обозначал операцию умножения, следует поместить перед ним символ обратной косой черты.
$ expr 12 * 12
expr; syntax error
$ expr 12 \* 12
144
Чтобы оператор echo включал метасимволы, воспользуйтесь символом обратной косой черты. В следующем примере отображается цена $19.99. Поскольку не применяется символ обратной косой черты, интерпретатор shell трактует эту цену иначе.
$ echo * "That video looks a good price for $19.99"
That video looks a good price for 9.99
Если же перед знаком доллара поставить знак обратной косой черты, то получим искомый результат.
$ echo "That video looks a good price for \$19.99"
That video looks a good price for $19.99
15.6. Заключение
При использовании кавычек желательно следовать двум правилам:
1. Всегда применяйте двойные кавычки при выводе на экран строк командой echo.
2. Если при использовании кавычек полученный результат разочаровал вас, поменяйте кавычки и повторите команду. В конце концов, существует всего три вида кавычек.
Часть 4
Основы shell–программирования
ГЛАВА 16
Понятие о shell–сценарии
В shell–сценарий может включаться одна или несколько команд; здесь нет общепринятых правил. Зачем же создавать целый сценарий ради двух–трех команд? Все зависит от предпочтений пользователя.
В этой главе рассматриваются следующие темы:
• цель создания shell–сценариев;
• основные компоненты shell–сценария;
• способы запуска shell–сценария.
16.1. Зачем создаются shell–сценарии
Применение shell–сценариев позволяет экономно расходовать рабочее время при выполнении важных и сложных заданий. В конце концов, почему бы для выполнения определенного задания не использовать листинг команд? Затем можно только просмотреть данные вывода. Если результаты удовлетворительные, можно переходить к выполнению следующего задания. Если же результаты не устраивают вас, следует внимательно изучить листинг. Shell–сценарии производят сортировку файлов, вставку текста в файлы, перемещение файлов, удаление строк из файлов, а также удаление старых файлов из системы. Shell–сценарии также выполняют в системе некоторые административные задания. В этих сценариях используются переменные, условные, арифметические и циклические конструкции, которые можно отнести к системным командам. За счет этих возможностей сценарии создаются довольно быстро. Интерпретатор команд может применять в качестве вводных данных для одной команды информацию, полученную при выполнении другой команды. Чтобы shell–сценарий применялся в различных системах UNIX и Linux, в него нужно внести лишь небольшие изменения. Это связано с тем, что интерпретатор shell обладает высокой степенью универсальности. Определенные трудности возникают лишь вследствие ориентации системных команд на определенные системы.