$@
Означает то же самое, что и параметр $#, но, если параметр заключен в кавычки, то и каждый аргумент отображается в кавычках
$-
Отображение текущих опций интерпретатора команд; аналогично применению команды set
$?
Показывает код завершения последней команды. Значение 0 свидетельствует об отсутствии ошибок, любое другое значение -o, их наличии
Преобразуем сценарий param, применяя некоторые специальные параметры. Затем выполним сценарий.
$ pg param
#!/bin/sh
# все параметры
echo "This ls the script name : §0"
echo "This ls the first parameter : $1"
echo "This is the second parameter : $2"
echo "This ls the third parameter : $3"
echo "This ls the fourth parameter : $4"
echo "This ls the fifth parameter : $5"
echo "This ls the sixth parameter : $6"
echo "This ls the seventh parameter : $7"
echo "This ls the eighth parameter : $8"
echo "This ls the ninth parameter : $9"
echo "The number of arguments passed : $#"
echo "Show all arguments : $*"
echo "Show me my process ID : $$"
echo "Show me the arguments in quotes :" "$@"
echo "Did my script go with any errors : $?"
$ param Merry Christmas Mr Lawrence
This ls the script name : ./param
This ls the first parameter : Merry
This ls the second parameter : Christmas
This ls the third parameter : Mr Lawrence
This ls the fourth parameter :
This ls the fifth parameter :
This ls the sixth parameter :
This ls the seventh parameter ;
This ls the eighth parameter :
This ls the ninth parameter :
The number of arguments passed ;3
Show all arguments : Merry Christmas Mr Lawrence
Show me my process ID : 630
Show me the arguments in quotes :"Merry" "Christmas" "Mr Lawrence"
Did my script go with any errors :0
При выводе данных с помощью специальных параметров можно получить много полезной информации о сценарии. Существует возможность проверить, какое число аргументов передается, а также идентификатор процесса этого сценария в том случае, если нужно уничтожить сценарий.
14.4.4. Код завершения последней команды
Обратите внимание, что параметр $? возвращает значение 0. Этот прием можно использовать во всех командах или сценариях, если необходимо выяснить, успешно ли выполнена последняя команда. С помощью этой информации можно продолжить работу со сценарием. Если возвращается значение 0, значит все идет успешно; значение 1 означает появление ошибки.
Ниже приводится пример. Сначала файл копируется в каталог /tmp и с помощью параметра $? проверяется результат.
$ cр ok.txt /tmp
$ echo $?
0
Скопируем файл в несуществующий каталог:
$ cp ok.txt /usr/local/apps/dsf
cp: cannot create regular file '/usr/local/apps/dsf': No such file or
directory
$ echo $?
1
При проверке состояния возврата с помощью параметра $? отображается 1. Это свидетельствует о наличии ошибок. Появляется сообщение о системной ошибке "cp: cannot…", поэтому не требуется проверять код завершения последней команды. Сценарии функционируют с помощью системных команд. Обычно пользователь не заинтересован в отображении большого количества значений. Поэтому выходной поток перенаправляется в системную корзину /dev/null Каким образом пользователь узнает, что последняя команда была успешной? С помощью кода завершения последней команды. Рассмотрим пример, иллюстрирующий изложенный материал.
$ cp ok.txt /uer/local/appe/dsf >/dev/null 2>&1
$ echo $?
1
Если данные вывода, включая сообщения об ошибках, перенаправить в системную корзину, невозможно установить, выполнялась ли последняя команда. Но благодаря применению параметра $?, который возвращает значение 1, становится известно, что при выполнении команды были допущены ошибки.
При проверке в сценариях кода завершения удобно проверяемым операциям присваивать содержательные названия. Желательно, чтобы название отражало функции данной операции; кроме того, сценарии приобретут более структурированный вид.
$ cp ok.txt /usr/local/apps/dsf >/dev/null 2>&1
$ cp_status=$?
$ echo $cp_status
1
14.5. Заключение
Работа с переменными значительно облегчает функционирование интерпретатора shell. Автоматизируется ввод данных, повышается производительность труда администратора. Переменная интерпретатора shell может принимать произвольные значения. Использование специальных переменных расширяет функциональные возможности сценариев и позволяет получать больше информации о параметрах, передаваемых в сценарии.
ГЛАВА 15
Использование кавычек
В главе 14 обсуждались методы работы с переменными и операции подстановки. Чаще всего ошибки в использовании кавычек возникают при выполнении подстановок переменных в сценариях. Кавычки оказывают существенное влияние на формирование командных строк.
В этой главе рассматриваются следующие темы:
• правила применения кавычек;
• двойные, одинарные и обратные кавычки;
• отмена специального значения символов с помощью символа обратной косой черты.
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