Библиотека сайта rus-linux.net
Руководство по Bash для начинающих | ||
---|---|---|
Назад | Глава 7: Условные инструкции | Вперед |
Расширенные варианты использования конструкции if
Конструкции if/then/else
Учебный пример
Эта конструкция используется для выбора одного варианта действий в случае, если команды в if при проверке возвращают значение истина, и другого варианта действий в случае, если это команды возвращают ложь. Например:
freddy scripts> gender="male" freddy scripts> if [[ "$gender" == f* ]] More input> then echo "Pleasure to meet you, Madame." More input> else echo "How come the lady hasn't got a drink yet?" More input> fi How come the lady hasn't got a drink yet? freddy scripts>
[] или [[]] | |
Если вместо [[ "value" == val* ]]. |
Точно также, как в списке CONSEQUENT-COMMANDS, который следует за инструкцией then, в списке ALTERNATE-CONSEQUENT-COMMANDS, которая следует за инструкцией else, может использоваться любая команда UNIX, возвращающая код возврата.
Еще один пример, являющийся расширенным вариантом примера из раздела "Проверка кода возврата":
anny ~> su - Password: [root@elegance root]# if ! grep ^$USER /etc/passwd 1> /dev/null > then echo "your user account is not managed locally" > else echo "your account is managed from the local /etc/passwd file" > fi your account is managed from the local /etc/passwd file [root@elegance root]#
Чтобы продемонстрировать действие инструкции else, мы переходим в учетную запись пользователя root; обычно, root является вашей локальной учетной записью, тогда как управление вашей собственной учетной записью может осуществляться централизованно, например, сервером LDAP.
Проверка аргументов командной строки
Вместо того, чтобы задавать значение переменной, а затем выполнять скрипт, часто более элегантным решением будет присваивание значений переменным в командной строке.
Для этой цели мы используем позиционные параметры $1
, $2
, ..., $N
. В параметре $#
указывается количество аргументов командной строки. В $0
указывается имя скрипта.
Ниже приводится простой пример:
Рис. 7.1. Проверка аргументов командной строки с помощью if
Вот еще один пример, с использованием двух аргументов:
anny ~> cat weight.sh #!/bin/bash # This script prints a message about your weight if you give it your # weight in kilos and height in centimeters. weight="$1" height="$2" idealweight=$[$height - 110] if [ $weight -le $idealweight ] ; then echo "You should eat a bit more fat." else echo "You should eat a bit more fruit." fi anny ~> bash -x weight.sh 55 169 + weight=55 + height=169 + idealweight=59 + '[' 55 -le 59 ']' + echo 'You should eat a bit more fat.' You should eat a bit more fat.
Проверка количества аргументов
В следующем примере показано, как изменить предыдущий скрипт с тем, что он выдавал сообщение в случае, если число указанных аргументов больше или меньше двух:
anny ~> cat weight.sh #!/bin/bash # This script prints a message about your weight if you give it your # weight in kilos and height in centimeters. if [ ! $# == 2 ]; then echo "Usage: $0 weight_in_kilos length_in_centimeters" exit fi weight="$1" height="$2" idealweight=$[$height - 110] if [ $weight -le $idealweight ] ; then echo "You should eat a bit more fat." else echo "You should eat a bit more fruit." fi anny ~> weight.sh 70 150 You should eat a bit more fruit. anny ~> weight.sh 70 150 33 Usage: ./weight.sh weight_in_kilos length_in_centimeters
Первым аргументом является $1
, вторым - $2
и так далее. Общее число аргументов хранится в $#
.
Более элегантный способ выдачи сообщений приведен в разделе "Использование инструкции exit и if".
Проверка существования файла
Проверка выполняется во многих скриптах, поскольку большинство программ нет смысла запускать, если вы знаете, что они не выполнят работу:
#!/bin/bash # This script gives information about a file. FILENAME="$1" echo "Properties for $FILENAME:" if [ -f $FILENAME ]; then echo "Size is $(ls -lh $FILENAME | awk '{ print $5 }')" echo "Type is $(file $FILENAME | cut -d":" -f2 -)" echo "Inode number is $(ls -i $FILENAME | cut -d" " -f1 -)" echo "$(df -h $FILENAME | grep -v Mounted | awk '{ print "On",$1", \ which is mounted as the",$6,"partition."}')" else echo "File does not exist." fi
Заметьте, для ссылки на файл используется переменная; в данном случае это первый аргумент в скрипте. В других случаях, когда аргументы не задаются, обычно в начале скрипта в переменные записывается местоположение файлов. Таким образом, если вы захотите в скрипте изменить имя файла, вам потребуется это сделать только один раз.
Имена файлов с пробелами | |
Приведенный выше пример не
сработает, если значение переменной |
Предыдущий раздел: | Оглавление | Следующий раздел: |
Знакомимся с инструкцией if | Конструкции if/then/elif/else |