Пример.
echo "$НОМЕ"
19.7.5. Подстановка команд и арифметических выражений
В гл. 13 (п. 13.5) мы уже сталкивались с подстановкой команд. Тогда переменной DT присваивался результат выполнения команды date:
DT=`date`
Как я уже писал, при подстановке команд нужно использовать обратные одинарные кавычки (они расположены под символом тильды на клавиатуре). Подставлять можно не только одну команду, а целые списки команд:
USERS=`who | wd –l`
UP=`date; uptime`
В первом случае мы получим количество пользователей работающих в системе, а во втором — последовательно записанные результаты выполнения команд date и uptime.
Подставлять результаты выполнения можно не только в переменные, а и в другие команды, например:
grep `id –un` /etc/passwd
Данная команда ищет в файле /etc/passwd вхождение результата выполнения команды id –un
Подстановка арифметических выражений осуществляется с помощью конструкции $(( выражение )) Например:
А = $(( (10+51/2 ))
echo $A
При этом на экране вы увидите число 7, а не 7.5, потому что используется целочисленное вычисление. Пример. Количество часов, прошедшее с момента запуска оболочки:
hrs = $(( $SECONDS/3600 ))
19.7.6. Управляющие структуры и циклы
К управляющим структурам относятся:
• Конструкция if-fi.
• Конструкция case-esac.
Конструкция if-fi
Общий синтаксис конструкции if-fi:
if список1 then
список2
elif
список3
then
список4
else
список3
fi
Конструкция if-fi работает так же, как и в других языках программирования. Если список1 (условие) истинный, выполняется список1, иначе выполняется список3 и проверяется его истинность и т.д. Допускается неограниченная вложенность операторов if. Например:
if uuencode myfile myfile > myfile.uu; then
echo "Успешное конвертирование";
else
echo "Ошибка";
fi
Можно использовать сокращенный вариант:
if список1 then
список2
fi
Например:
if [ $? –ne 0 ]; then echo "Ошибка. См. файл протокола"; fi;
Вместо списка команд удобно использовать команду test или выражение [условие]. Например, следующие выражения аналогичны:
test –e /etc/passwd
[-е /etc/passwd]
И первое, и второе выражение проверяют существование файла /etc/passwd. Другие опции команды test представлены в табл. 19.38.
Опции команды test Таблица 19.38
Опция Возвращаемое значение и описание -d файл Истина, если файл существует и является каталогом -е файл Истина, если файл существует -f файл Истина, если файл существует и является простым файлом -k файл Истина, если файл существует и для него установлен бит односторонней операции -L файл Истина, если файл существует и является ссылкой -r файл Истина, если файл существует и доступен для чтения -s файл Истина, если файл существует и его размер больше 0 -х файл Истина, если файл существует и является исполнимым -w файл Истина, если файл существует и доступен для записи -о файл Истина, если файл существует и принадлежит данному пользователю -z строка Истина, если длина строки равна 0 -n строка Истина, если длина строки не равна 0
Команда test, в случае успешного завершения, возвращает значение истина, то есть 0 — успешное завершение. Если в скобках стоит непустое слово, test возвратит тоже 0, например:
[ word ]; echo $?
0
[]; echo $?
1
В первом случае возвращается истина (true), на экран выводится ноль — код удачного (безошибочного) завершения программы. Во втором случае на экран выводится единица — команда test возвратила значение ложь (false). Сравнение строк осуществляется следующим образом: выражения str1 = str2 или str1 == str2 истинны, когда строки str1 и str2 равны. Обратите внимание: между двумя символами равно не должно быть пропуска!
Символ ! инвертирует любое условие команды test, например, выражение str1 != str2 будет истинным, когда строки str1 и str2 не равны между собой. Символ ! является символом логической операции NOT (отрицание). Кроме этого символа, можно использовать опции команды –о и –а, которые обозначают логические операции ИЛИ (OR) и И (AND). Например:
str="word"; export str; ["$str" –a –f /etc/passwd]; echo $?
0
str=""; export str; ["$str" –a –f /etc/passwd]; echo $?
1
В первом случае непустая строка str возвращает истину, опция —f возвращает также истину, потому что файл /etc/passwd существует всегда. Результат операции И: истина И истина = истина, поэтому на экране вы увидите 0.
Во втором случае пустая строка str возвратит ложь, а опция –f возвращает истину. Результат операции И: ложь И истина = ложь. Если вы забыли законы логики, освежите свои знания с помощью табл. 19.39.
Логические операции Таблица 19.39
AND True False OR True False XOR True False True True False True True True True False True False False False False True False False True False
Операция XOR — это исключающее ИЛИ. Данная операция не используется при создании сценариев с помощью интерпретатора bash.
Для сравнения целых чисел используются опции команды test,приведенные в табл. 19.40.
Сравнение целых чисел Таблица 19.40
Опция Описание -eq Равно -ne Не равно -It Меньше -gt Больше -le Меньше или равно -ge Больше или равно
Интерпретатор bash воспринимает строки, как целые числа. Если нужно обнулить строку, то это достигается таким присваиванием: х=0.
Пример.
х=124 ; export х ; [ 111 –It "$х" ] ; echo $?
0
Поскольку 111 меньше, чем 124, на экране вы увидите 0 (истина).
Примечание. Во всех примерах, вы, наверное, заметили использование команды export. Это необходимо для того, чтобы порожденному процессу (не забывайте: test — это отдельная программа) переменнаях была доступна.
Теперь, когда мы уже знакомы с конструкциями test и if, рассмотрим небольшой пример, демонстрирующий вложенность операторов if и использование команды test. Пример приведен в листинге 19.2.
Листинг 19.2. Пример вложенности операторов
echo –n "Какую оценку ты получил сегодня по программированию? "
read x
if [ $х = 5 ]
then echo "Отлично !"
elif [ $х = 4 ]
then echo "Хорошо"
elif [ $x = 3 ]
then echo "Удовлетворительно"
elif [ $x = 2 ]
then echo "Надо бы пересдать"
else
echo "Как вообще можно было получить такую оценку???"
fi