Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по 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>
[] или [[]]

Если вместо [ использовать [[, значения переменных не разбиваются на слова. Таким образом, если VAR="var with spaces", вам при проверке не нужно заключать $VAR в двойные кавычки - даже несмотря на то, что использование кавычек остается хорошей привычкой. Кроме того, [[ предотвращает подстановку имен файлов, так что в литеральных строках, в которых есть универсальные символы подстановки, эти символы не будут замещаться именами файлов. Когда используются [[, операторы == and != интерпретируют строки, стоящие от них справа, как глобальные шаблоны командной оболочки, значение которых должны соответствовать значению, находящемуся слева, например:

[[ "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

Заметьте, для ссылки на файл используется переменная; в данном случае это первый аргумент в скрипте. В других случаях, когда аргументы не задаются, обычно в начале скрипта в переменные записывается местоположение файлов. Таким образом, если вы захотите в скрипте изменить имя файла, вам потребуется это сделать только один раз.

Имена файлов с пробелами

Приведенный выше пример не сработает, если значение переменной $1 будет разбито на несколько слов. В этом случае, можно добиться правильной работы команды if, если заключить имя файла в двойные кавычки, либо если использовать [[ вместо [.


Предыдущий раздел: Оглавление Следующий раздел:
Знакомимся с инструкцией if   Конструкции if/then/elif/else