Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"
Автор книги: Дэвид Тейнсли
сообщить о нарушении
Текущая страница: 12 (всего у книги 25 страниц)
В приведенной таблице в качестве примера демонстрируется, как можно получить доступ к каждому параметру, если в сценарий передается строка "Did You See The Full Moon"
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
Наименование сценария
Did
You
See
The
Full
Moon
14.4.1. Применение в сценариях позиционных параметров
Воспользуемся приведенным выше примером в следующем сценарии.
$ pg param
#!/bin/sh # параметры
echo "This ls the script name : $0"
echo "This ls the first parameter : $1"
echo "This ls 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 : S6"
echo "This ls the seventh parameter : $7"
echo "This ls the eighth parameter : $8"
echo "This ls the ninth parameter : $9"
$ param Did You See The Full Moon
This ls the script name : ./param
This ls the first parameter : Did
This ls the second parameter : You
This ls the third parameter : See
This ls the fourth parameter : The
This ls the fifth parameter : Full
This ls the sixth parameter : Moon
This ls the seventh parameter :
This ls the eighth parameter :
This ls the ninth parameter :
Если передаются шесть параметров, седьмой, восьмой и девятый будут пустыми, чего и следовало ожидать. Обратите внимание, что первый параметр содержит название сценария. Этот параметр удобно использовать, если сценарий выдает сообщение об ошибках. Ниже приводится другой пример, где получается название: сценария.
$ pg param2 .
#!/bin/sh
echo "Hello world this ls $0 calling"
$ param2
Hello world this ls ./param2 calling
Заметьте, что параметр $0 также позволяет получить путь доступа к текущему каталогу. Для получения названия сценария предварите параметр $0 командой
basename.
$ pg param2
#!/bin/sh
echo "Hello world this ls `basename $0` calling"
$ param2
Hello world this ls param2 calling
14.4.2. Передача параметров в системные команды
Параметры можно передавать внутри сценария в системную команду. В следующем примере используется команда find . Параметр $1 указывает имя искомого файла.
$ pg findfile
#!/bin/sh
# findfile
find / -name $1 -print
$ findfile passwd
/etc/passwd
/etc/uucp/passwd
/usr/bin/passwd
Ниже приводится другой пример. В виде параметра $1 файл user‑id передается команде grep; команда grep использует эти сведения для поиска файла passwd, где содержится полное имя пользователя.
$ pg who_is
#!/bin/sh
# who_is
grep $1 passwd | awk -F: {print $4}'
$ who_is seany
Seany Post
14.4.3. Специальные параметры
Теперь, когда вы изучили, как получить доступ к параметрам shell–сценариев и применять их, было бы полезным узнать об этих параметрах больше. Рассмотрим, каким образом сценарий применяет специальные параметры. Существует семь специальных параметров, которые представлены в табл. 14.2.
Таблица 14.2. Специальные параметры интерпретатора shell
$#
Число аргументов, передаваемых сценарию
$*
В отдельной строке отображаются все аргументы, которые передаются сценарию. Здесь может содержаться более девяти параметров, в отличие от позиционных параметров
$$
Текущий идентификатор PID для выполняющегося сценария
$!
Идентификатор PID для последнего процесса, который выполняется в фоновом режиме
$@
Означает то же самое, что и параметр $#, но, если параметр заключен в кавычки, то и каждый аргумент отображается в кавычках
$-
Отображение текущих опций интерпретатора команд; аналогично применению команды 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
$ 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 обладает высокой степенью универсальности. Определенные трудности возникают лишь вследствие ориентации системных команд на определенные системы.
16.1.1. Не отказывайтесь от новых идей
Не впадайте в уныние, если созданный вами сценарий не оправдывает ваших ожиданий. Просто помните о том, что какой бы ни был сценарий, возникшие в результате его выполнения неприятные последствия являются устранимыми. Однако перед выполнением пробного сценария подумайте о том, созданы ли резервные копии? В любом случае не стоит отказываться от новых идей. Если вы придерживаетесь иного мнения, вряд ли вы искренни перед собой и, что более важно, вы не сможете оценить оригинальность новых решений, если не реализуете их на практике.
16.2. Структура сценария
В книге недостаточно внимания уделяется методике создания совершенных сценариев. Здесь речь идет, в основном, о программном коде, который может послужить прототипом для создания целого семейства новых сценариев. Не следует использовать сложные сценарии, если единственной целью этого является получение абсолютно непонятного программного кода. Если бы автор этой книги придерживался подобной методики, он произвел бы определенное впечатление на читателей, но осознание преимуществ подобного кода отняло бы массу драгоценного времени. Поэтому главной задачей данной книги было создание простого кода, при написании которого применялись базовые технологии создания сценариев. Благодаря этому читатель может довольно быстро освоить эти технологии и поражать своими знаниями друзей и знакомых!
Сценарий не относится к компилируемым программам, поскольку он интерпретируется построчно. Первой строкой сценария всегда должна быть строка вида:
#!/bin/sh
Система получает указание, где следует искать интерпретатор Bourne shell.
Каждый сценарий может содержать комментарии; если комментарии размещаются в сценарии, первым символом в строке комментария будет символ #. Встретив подобный символ, интерпретатор команд игнорирует строку комментария. Желательно, чтобы имя сценария находилось в строке, расположенной ниже строки комментария.
Сценарий просматривается интерпретатором команд в направлении сверху вниз. Перед выполнением сценария требуется воспользоваться командой chmod, устанавливающей право доступа на выполнение. Убедитесь в том, что правильно указан путь к сценариям, тогда для его выполнения достаточно будет указать имя файла сценария.
16.3. Выполнение сценария
Ниже рассматривается пример, который уже обсуждался ранее. В данном случае, файл называется cleanup.
$ pg cleanup
#!/bin/sh
#имя: cleanup
#это общий сценарий, выполняющий очистку echo "starting cleanup…wait"
rm /usr/local/apps/log/*.log
tail -40 /var/adm/messages /tmp/messages
rm /var/adm/messages
mv /tmp/messages /var/adm/messages
echo "finished cleanup"
Приведенный выше сценарий отменяет отображение сообщений /var/adm/ путем усечения файла сообщений. В задачи этого сценария также входит удаление всех журнальных файлов в каталоге /usr/local/apps/log.
Для выполнения сценария применим команду chmod:
$ chmod u+x cleanup
Чтобы запустить сценарий на выполнение, введите его название:
$ cleanup
При отображении сообщения об ошибке, например:
$ cleanup
sh: cleanup: command not found
воспользуйтесь командой: $ ./cleanup
Если перед выполнением сценария нужно указать путь доступа к нему или же сценарий сообщает, что не может обнаружить команду, достаточно в значение переменной path из файла .profile добавить каталог bin. При вводе следующей информации сначала убедитесь, что вы находитесь в каталоге $HOME/bin:
$ pwd
$ /home/dave/bin
Если последняя часть команды pwd включает название подкаталога /bin, его следует использовать при указании имени пути. Измените файл .profile и добавьте в файл .profile каталог $HOME/bin:
PATH=$PATH:$HOME/bin
В случае если подкаталог /bin отсутствует, создайте его; сначала удостоверьтесь, что находитесь в начальном каталоге.
$ cd $HOME
$ mkdir bin
После этого добавьте каталог bin в переменную PATH в файле .profile, затем заново инициализируйте файл .profile
$ . .profile
Теперь все должно получиться.
Если же проблемы остались, просмотрите главы 2 и 13. В этих главах содержатся сведения о командах find и xargs, а также о настройках переменных среды, которые окажутся полезными при создании и выполнении сценариев.
Все листинги книги являются полными. Чтобы запустить на выполнение сценарии, введите в файл команды, сохраните его на диске и выйдите из текстового редактора. Затем воспользуйтесь командой chmod для установки права выполнения. Теперь можно переходить к делу.
16.4. Заключение
Глава служит кратким введением в методику работы с shell–сценариями. Вероятно, вам пока нет необходимости подробно изучать вопросы, связанные с функционированием сценариев, вводом/выводом данных интерпретатора shell и т. п. Необходимые знания придут после внимательного изучения материала книги. Глава помогает пользователю уяснить, как начать работу с shell–сценарием.
ГЛАВА 17
Проверка условий
При создании сценария уточняется идентичность строк, права доступа к файлу или же выполняется проверка численных значений. На основе результатов проверки предпринимаются дальнейшие действия. Проверка обычно осуществляется с помощью команды test. Команда test используется для тестирования строк, проверки прав доступа к файлу и численных данных. Как будет показано в следующей главе, эта команда хорошо согласуется с условной конструкцией if, then, else.
В главе рассматриваются следующие темы:
• применение команды test для обработки файлов, строк и чисел;
• использование команды expr при проверке численных значений и строк. Команда expr выполняет проверку и вывод численных данных. Команды test
и expr с помощью кода завершения последней команды $? выводят на экран значение 0, если заданное условие выполняется, и 1, если условие не выполняется.
17.1. Проверка прав доступа к файлу
Основные форматы команды test:
test условие
или
[ условие ]
Обратите внимание, что с обеих сторон от условия обязательно остаются пробелы. При проверке права на доступ к файлу может применяться довольно много условий. В табл. 17.1 содержится перечень наиболее распространенных условий.
Таблица 17.1. Проверка прав доступа к файлу
-d
Каталог
-f
Обычный файл
-L
Символическая связь
-r
Файл для чтения
-s
Файл имеет ненулевой размер, он не пуст
-w
Файл для записей
-u
Файл имеет установленный бит suid
-x
Исполняемый файл
Чтобы проверить, установлено ли право записи для файла scores.txt, применяются оба метода проверки. При осуществлении проверки используется код завершения последней команды. Не забывайте о том, что возвращаемое нулевое значение свидетельствует о том, что условие выполняется, любое другое значение говорит о наличии ошибки.
$ ls -l scores.txt
–rw‑r—г -l dave admin 0 May 15 11:29 scores.txt
$ [ -w scores.txt ]
$ echo $?
0
$ test -w scores.txt
$ echo $?
0
В обоих случаях отображается значение нуль, поэтому для данного файла установлены права записи. Теперь рассмотрим, является ли этот файл исполняемым.
$ [ -х scores.txt ]
$ echo $?
1
Нет, не является, что и следовало ожидать после изучения списка прав доступа для файла scores.txt.
В следующем примере проверяется существование каталога appsbin.
drwxr‑xr‑x 2 dave admin 1024 May 15 15:53 appsbin
$ [ -d appsbin ]
$ echo $?
0
Ответ утвердительный, каталог appsbin присутствует. Чтобы проверить, установлен ли бит suid, примените:
–rwsr‑x– 1 root root 28 Apr 30 13:12 xab
$ [ -u xab ]
$ echo $?
0
Из этого примера следует, что бит suid установлен.
17.2. Применение логических операторов при осуществлении проверки
Итак, проверка прав доступа к файлу была осуществлена, но иногда возникает необходимость в сравнении различных прав доступа. Чтобы реализовать подобную проверку интерпретатор shell предлагает три типа логических операторов;
-a
Логическое AND, возвращает истину, если обе части оператора принимают истинное значение
-o
Логическое OR, возвращает истину, если какая‑либо из частей оператора может принимать истинное значение
!
Логическое NOT, возвращает истину, если условие ложно
А теперь выполним сравнение следующих файлов:
–rw‑r–r– 1 root root 0 May 15 11:29 scores.txt
–rwxr‑xr– 1 root root 0 May 15 11:49 results.txt
В следующем примере проверяется, установлены ли для файлов права чтения.
$ [ -w results.txt -a -w scores.txt ]
$ echo $?
0
Ответ звучит утвердительно.
Чтобы проверить, установлены ли для какого‑либо из файлов права выполнения, воспользуйтесь логическим оператором OR.
$ [ -х results.txt -о -x scores.txt ]
$ echo $?
0
Файл scores.txt не является исполняемым, а файл results.txt – исполняемый. Чтобы проверить, установлены ли для файла results.txt права записи и выполнения, примените следующую команду:
$ [ -w results.txt -a -x results.txt ]
$ echo $?
0
В данном случае получается утвердительный ответ.
17.3. Проверка строк
Проверка строк является важным этапом при отслеживании ошибок. Значение этого этапа повышается, если проверяются вводимые пользователями данные либо выполняется сравнение переменных. Чтобы проверить строки, достаточно выбрать один из пяти форматов.
test "строка"
test оператор_строки "строка"
test "строка" оператор_строки "строка"
[ оператор_строки строка ]
[ строка оператор_строки строка ]
Здесь в качестве выражения оператор_строки могут использоваться следующие операторы:
== Две строки равны
!= Две строки не равны
–z Эта строка нулевая
–n Эта строка не является нулевой
Чтобы проверить, присвоено ли переменной среды editor нулевое значение, примените команду:
$ [ -х $EDITOR ]
$ echo $?
1
Ответ отрицательный. Присвоено ли этой переменной значение vi?
$ [ $EDITOR= "vi" ]
$ echo $?
0
Ответ утвердительный. Отобразим это значение на экране:
$ echo $EDITOR
vi
Проверить, равны ли значения переменных таре и таре2, можно, воспользовавшись следующей командой:
$ TAPE="/dev/rmt0"
$ TAPE2="/dev/rmt1"
$ [ "$TAPE" = "$ТАРЕ2" ]
$ echo $?
1
Ответ отрицательный. При присваивании переменных необязательно применять двойные кавычки. Но при сравнении строк использование двойных кавычек является непременным условием.
Чтобы проверить "неравенство" переменных таре и таре2, примените следующую команду:
$ [ »$TAPE" != "$ТАРЕ2" ]
$ echo $?
0
Значения этих переменных не равны.
17.4. Проверка чисел
Для сравнения чисел можно воспользоваться операторами другого рода. Общий формат:
"число" числовой_оператор "число" или
[ "число" числовой_оператор "число" ]
где в качестве выражения числовой_оператор могут фигурировать следующие операторы:
-eq
Два числа равны
-ne
Два числа не равны
-gt
Первое число больше второго числа
-lt
Первое число меньше второго числа
-le
Первое число меньше или равно второму числу
-gt
Первое число больше или равно второму числу
Выясним, равно ли одно число другому (в данном случае рассматривается, равно ли число 130 числу 130):
$ NUMBER=130
$ [ "$NUMBER" -eq "130" ]
$ echo $?
0
Превосходно! Результатом сравнения явилось значение "истина". Теперь изменим второе число и проверим, отобразится ли сообщение об ошибке. Возвращается значение 1 (130 не равно 100(.
$ [ "$NUMBER" —eq "100" ] $ echo $?
1
Чтобы проверить, является ли число 130 больше числа 100, воспользуйтесь следующей командой:
$ [ "$NUMBER" —gt "100" ]
$ echo $?
0
Ответ утвердительный.
Так же можно проверять два целых значения переменных. Ниже уточняется, будет ли значение переменной DEST_COUNT большим, чем значение переменной SOURCE_COUNT.
$ SOURCE_COUNT=13
$ DEST_COUNT-15
$ [ "$DEST_COUHT" -gt "$SOURCE_COUNT" ]
$ echo $?
0
Необязательно для выполнения проверки обращаться к переменной: можно сравнивать и числа, но в этом случае следует применять кавычки:
$ [ "990" -le "995" ] $ echo $?
0
Можно также комбинировать и тестировать выражения с помощью логических операторов. При этом следует пользоваться только одной парой квадратных скобок – не применяйте две пары скобок. Если не учитывать этого замечания, отобразится сообщение об ошибке – "too many arguments" (слишком много аргументов):
$ [ "990" -le "995" ] —а [ "123" —gt "33" ]
sh:[: too many arguments
В следующем примере проверяются два выражения. Если оба выражения истинны, результат будет истинным. Ниже приводится корректный метод выполнения проверки.
$ [ "990" -le "995" -a "123" -gt "33" ] $ echo $?
0
17.5. Применение команды expr
Команда expr используется в основном для проверки целочисленных значений, но может применяться также и при обработке строк. Общий формат команды expr:
expr аргумент оператор аргумент
Команду expr удобно использовать для подсчета количества строк:
$ expr 10 + 10
20
$ expr 900 + 600
1500
$ expr 30/3
10
$ expr 30/3/2
5
В случае применения знака умножения, можно с помощью обратной косой черты отменить его значение– Если этого не сделать, интерпретатор команд может неверно определить значение символа *: