Чтение онлайн

ЖАНРЫ

Командная строка Linux
Шрифт:

echo "INT is even."

else

echo "INT is odd."

fi

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Применив регулярное выражение, мы смогли ограничить круг проверяемых значений в константе INT только строками, начинающимися с необязательного знака «минус», за которым следует одна или несколько цифр. Это выражение также устраняет вероятность появления пустых значений.

Еще одна дополнительная особенность [[ ]]:

оператор == поддерживает сопоставление с шаблоном по аналогии с механизмом подстановки путей. Например:

[me@linuxbox ~]$ FILE=foo.bar

[me@linuxbox ~]$ if [[ $FILE == foo.* ]]; then

> echo "$FILE matches pattern 'foo.*'"

> fi

foo.bar matches pattern 'foo.*'

Она превращает [[ ]] в удобный инструмент проверки имен файлов и путей.

— для проверки целых чисел

В дополнение к составной команде [[ ]] bash поддерживает также составную коман­ду , которую удобно использовать для работы с целыми числами. Она поддерживает полное множество арифметических операторов, о которых подробно рассказывается в главе 34.

Команда применяется для проверки истинности арифметических выражений. Арифметическое выражение считается истинным, если его результат отличается от нуля.

[me@linuxbox ~]$ if ((1)); then echo "It is true."; fi

It is true.

[me@linuxbox ~]$ if ((0)); then echo "It is true."; fi

[me@linuxbox ~]$

Применив , можно немного упростить сценарий test-integer2, как пока­зано ниже:

#!/bin/bash

# test-integer2a: проверка целочисленного значения.

INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if ((INT == 0)); then

echo "INT is zero."

else

if ((INT < 0)); then

echo "INT is negative."

else

echo "INT is positive."

fi

if (( ((INT % 2)) == 0)); then

echo "INT is even."

else

echo "INT is odd."

fi

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Обратите внимание, что здесь мы использовали знак «меньше», а равенство проверяется с помощью оператора ==. Такой синтаксис выглядит более естественным при работе с целыми числами. Отметьте также, что составная команда является частью синтаксиса командной оболочки, а не обычной командой, может применяться только к целым числам, распознает переменные по именам и не требует выполнять подстановку.

Объединение выражений

Для более сложных вычислений существует возможность объединения выражений. Объединяются выражения с помощью логических операторов. Мы уже встречались с ними в главе 17, когда изучали команду find. Всего команды test и [[ ]] поддерживают три логические операции. Это

И (AND), ИЛИ (OR) и НЕ (NOT). Для представления этих операций test и [[ ]] используют разные операторы, как показано в табл. 27.4.

Таблица 27.4. Логические операторы

Операция

test

[[ ]] и

И

– a

&&

ИЛИ

– o

||

НЕ

!

!

Ниже приводится пример использования операции И (AND). Следующий сценарий определяет вхождение целочисленного значения в определенный диапазон:

#!/bin/bash

# test-integer3: проверка вхождения целочисленного значения

# в определенный диапазон.

MIN_VAL=1

MAX_VAL=100

INT=50

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then

echo "$INT is within $MIN_VAL to $MAX_VAL."

else

echo "$INT is out of range."

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Этот сценарий определяет, попадает ли целочисленное значение INT в диапазон между MIN_VAL и MAX_VAL. Эта операция выполняется единственной командой [[ ]], включающей два выражения, разделенных оператором &&. Ту же проверку можно выполнить с помощью test:

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then

echo "$INT is within $MIN_VAL to $MAX_VAL."

else

echo "$INT is out of range."

fi

Оператор отрицания! обращает результат выражения. Он возвращает истинное значение, если выражение ложно, и ложное значение, если выражение истинно. В следующем сценарии мы изменили логику вычислений, чтобы определить, находится ли значение INT за пределами указанного диапазона:

#!/bin/bash

# test-integer4: проверка выхода целочисленного значения

# за границы определенного диапазона.

MIN_VAL=1

MAX_VAL=100

INT=50

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then

echo "$INT is outside $MIN_VAL to $MAX_VAL."

else

echo "$INT is in range."

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Здесь выражение заключено в круглые скобки для группировки. Если этого не сделать, оператор отрицания будет применяться к результату первого выражения, а не к объединению двух выражений. Ту же проверку можно реализовать с помощью test:

if [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then

echo "$INT is outside $MIN_VAL to $MAX_VAL."

else

echo "$INT is in range."

fi

Поскольку все выражения и операторы в команде test интерпретируются командной оболочкой как аргументы (в отличие от [[ ]] и ), символы, имеющие специальное значение для bash, такие как <, >, ( и ), необходимо заключать в кавычки или экранировать.

Поделиться с друзьями: