foo bar bam
Как видите, заключенная в двойные кавычки переменная-параметр $@ представляет позиционные параметры как отдельные поля, независимо от значения переменной окружения IFS. Как правило, если вы хотите получить доступ к параметрам, лучше использовать переменную-параметр.
Помимо вывода на экран содержимого переменных с помощью команды echo, вы также можете прочитать его командой read (упражнение 2.2).
В приведенном далее сценарии показано несколько простых манипуляций переменными. После ввода сценария и записи его в файл try_var не забудьте превратить его в исполняемый файл с помощью команды chmod +х try_var.
#!/bin/sh
salutation="Hello"
echo $salutation
echo "The program $0 is now running"
echo "The second parameter was $2"
echo "The first parameter was $1"
echo "The parameter list was
echo "The user's home directory is $HOME"
echo "Please enter a new greeting"
read salutation
echo $salutation
echo "The script is now complete"
exit 0
Если вы выполните этот сценарий, то получите следующий вывод:
$ ./try_var foo bar baz
Hello
The program ./try_var is now running
The second parameter was bar
The first parameter was foo
The parameter list was foo bar baz
The user's home directory is /home/rick
Please enter a new greeting
Sire
Sire
The script is now complete $
Как это работает
Сценарий создает переменную salutation, выводит на экран ее содержимое и затем показывает, что уже сформированы и имеют соответствующие значения различные переменные-параметры и переменная окружения $НОМЕ.
Далее в этой главе мы рассмотрим более подробно подстановку параметров.
Условия
Основа всех языков программирования — средства проверки условий и выполнение различных действий с учетом результатов этой проверки. Но прежде чем говорить об этом, давайте рассмотрим условные конструкции, которые можно применять в сценариях командной оболочки, а затем познакомимся с использующими их управляющими структурами.
Сценарий командной оболочки может проверить код завершения любой команды, вызванной из командной строки, включая сценарии, написанные вами. Вот почему так важно всегда включать в создаваемые вами сценарии команду exit с определенным значением.
На практике в большинстве сценариев широко используется команда [ или test — логическая проверка командной оболочки. В некоторых системах команды [ и test — синонимы, за исключением того, что при использовании команды [ для удобочитаемости применяется и завершающая часть ]. Наличие команды [ может показаться странным, но в программном коде она упрощает синтаксис и делает его более похожим на другие языки программирования.
Эти команды в некоторых ранних оболочках UNIX вызывают внешнюю программу, но в более современных версиях их стараются делать встроенными. Мы вернемся к этому, когда будем рассматривать команды в следующем разделе.
Поскольку команда test не часто применяется за пределами сценариев командной оболочки, многие пользователи ОС Linux, никогда раньше не писавшие сценариев, пытаются создавать простые программы и называют их test. Если такая программа не работает, вероятно, она конфликтует с командой оболочки test. Для того чтобы выяснить, есть ли в вашей системе внешняя команда с данным именем, попытайтесь набрать что-нибудь вроде which test и проверить, какая именно команда test выполняется в данный момент, или используйте форму ./test, чтобы быть уверенным в том, что вы выполняете сценарий из текущего каталога. Если сомневаетесь, примите за правило выполнять свои сценарии, предваряя при запуске их имена комбинацией символов ./.
Мы представим команду test на примере одного простейшего условия: проверки наличия файла. Для нее понадобится следующая команда: test -f <имя_файла>, поэтому в сценарии можно написать
if test -f fred.c
then
...
fi
To же самое можно записать следующим образом:
if [ -f fred.c ]
then
...
fi
Код завершения команды test (выполнено ли условие) определяет, будет ли выполняться условный программный код.
Имейте в виду, что вы должны вставлять пробелы между квадратной скобкой [ и проверяемым условием. Это легко усвоить, если запомнить, что вставить символ [ — это все равно, что написать test, а после имени команды вы всегда должны вставлять пробел.
Если вы предпочитаете помещать слово then в той же строке, что и if, нужно добавить точку с запятой для отделения команды test от then:
if [ -f fred.c ]; then
...
fi
Варианты условий, которые вы можете применять в команде test, делятся на три типа: строковые сравнения, числовые сравнения и проверка файловых флагов (file conditionals). Эти типы условий описаны в табл. 2.4.
Таблица 2.4
| Варианты условий | Результат |
|---|---|
| Сравнения строк | |
Строка1 = Строка2
|
True (истина), если строки одинаковы |
Строка1 != Строка2
|
True (истина), если строки разные |
-n Строка
|
True (истина), еслиСтрока не null |
-z Строка
|
True (истина), еслиСтрока null (пустая строка) |
| Сравнения чисел | |
Выражение1 -eq Выражение2
|
True (истина), если выражения равны |
Выражение1 -ne Выражение2
|
True (истина), если выражения не равны |
Выражение1 -gt Выражение2
|
True (истина), еслиВыражение1 больше, чемВыражение2 |
Выражение1 -ge Выражение2
|
True (истина), еслиВыражение1 не меньшеВыражение2 |
Выражение1 -lt Выражение2
|
True (истина), еслиВыражение1 меньше, чемВыражение2 |
Выражение1 -lе Выражение2
|
True (истина), еслиВыражение1 не большеВыражение2 |
! Выражение
|
True (истина), еслиВыражение ложно, и наоборот |
| Файловый флаг | |
-d файл
|
True (истина), еслифайл— каталог |
-е файл
|
True (истина), еслифайл существует. Исторически, опция -e не была переносима на другие платформы, поэтому обычно применяется -f |
-f файл
|
True (истина), еслифайл— обычный файл |
-g файл
|
True (истина), если дляфайла установлен бит set-group-id |
-r файл
|
True (истина), если файл доступен для чтения |
-s файл
|
True (истина), если файл ненулевого размера |
-u файл
|
True (истина), если дляфайла установлен бит set-user-id |
-v файл
|
True (истина), еслифайл доступен для записи |
-х файл
|
True (истина), если файл — исполняемый файл |