Чтение онлайн

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

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

15.1. Правила применения кавычек

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

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

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

$ echo Hit the star button to exit *

Hit the star button to exit DIR_COLORS HOSTNAME Muttrc X11 adjtime aliases alias

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

$ echo "Bit the star button to exit *"

Hit the star button to exit *

Благодаря применению кавычек выражение интерпретируется верно. В табл. 15.1 приведены комментарии к различным типам кавычек.

Таблица 15.1. Использование кавычек интерпретатором shell

""

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

' '

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

``

Символ "тупого ударения" или обратные кавычки

\

Символ обратной косой черты

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

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

$ STRING="MAY DAY, MAY DAY, GOING DOWN"

$ echo "$STRING"

MAY DAY, MAY DAY, GOING DOWN

$ 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

Поделиться с друзьями: