Выбрать главу

if [[ $condition1 && $condition2 ]] # То же верно

# Обратите внимание: оператор && не должен использоваться внутри [ ... ].

оператор &&, в зависимости от контекста, может так же использоваться в И-списках для построения составных команд.

||

логическое ИЛИ (or)

if [ $condition1 ] || [ $condition2 ]

# То же самое, что: if [ $condition1 -o $condition2 ]

# Возвращает true если хотя бы один из операндов истинен...

if [[ $condition1 || $condition2 ]] # Also works.

# Обратите внимание: оператор || не должен использоваться внутри [ ... ].

Bash производит проверку кода возврата КАЖДОГО из операндов в логических выражениях.

Пример 8-3. Построение сложных условий, использующих && и ||

#!/bin/bash

a=24

b=47

if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]

then

echo "Первая проверка прошла успешно."

else

echo "Первая проверка не прошла."

fi

# ОКА: if [ "$a" -eq 24 && "$b" -eq 47 ]

# пытается выполнить ' [ "$a" -eq 24 '

# и терпит неудачу наткнувшись на ']'.

#

# if [[ $a -eq 24 && $b -eq 24 ]] это правильный вариант

# (в строке 17 оператор "&&" имеет иной смысл, нежели в строке 6.)

# Спасибо Stephane Chazelas.

if [ "$a" -eq 98 ] || [ "$b" -eq 47 ]

then

echo "Вторая проверка прошла успешно."

else

echo "Вторая проверка не прошла."

fi

# Опции -a и -o предоставляют

#+ альтернативный механизм проверки условий.

# Спасибо Patrick Callahan.

if [ "$a" -eq 24 -a "$b" -eq 47 ]

then

echo "Третья проверка прошла успешно."

else

echo "Третья проверка не прошла."

fi

if [ "$a" -eq 98 -o "$b" -eq 47 ]

then

echo "Четвертая проверка прошла успешно."

else

echo "Четвертая проверка не прошла."

fi

a=rhino

b=crocodile

if [ "$a" = rhino ] && [ "$b" = crocodile ]

then

echo "Пятая проверка прошла успешно."

else

echo "Пятая проверка не прошла."

fi

exit 0

Операторы && и || могут использоваться и в арифметических вычислениях.

bash$ echo $(( 1 && 2 )) $((3 && 0)) $((4 || 0)) $((0 || 0))

1 0 1 0

прочие операции

,

запятая

С помощью оператора запятая можно связать несколько арифметических в одну последовательность. При разборе таких последовательностей, командный интерпретатор вычисляет все выражения (которые могут иметь побочные эффекты) в последовательности и возвращает результат последнего.

let "t1 = ((5 + 3, 7 - 1, 15 - 4))"

echo "t1 = $t1" # t1 = 11

let "t2 = ((a = 9, 15 / 3))" # Выполняется присваивание "a" = 9,

#+ а затем вычисляется "t2".

echo "t2 = $t2 a = $a" # t2 = 5 a = 9

Оператор запятая чаще всего находит применение в циклах for. См. Пример 10-12.

8.2. Числовые константы

Интерпретатор командной оболочки воспринимает числа как десятичные, в противном случае числу должен предшествовать специальный префикс, либо число должно быть записано в особой нотации. Числа, начинающиеся с символа 0, считаются восьмеричными. если числу предшествует префикс 0x, то число считается шестнадцатиричным. Число, в записи которого присутствует символ #, расценивается как запись числа с указанием основы счисления в виде ОСНОВА#ЧИСЛО.

Пример 8-4. Различные представления числовых констант

#!/bin/bash

# numbers.sh: Различные представления числовых констант.

# Десятичное: по-умолчанию

let "dec = 32"

echo "десятичное число = $dec" # 32

# Вобщем-то ничего необычного.

# Восьмеричное: числа начинаются с '0' (нуля)

let "oct = 032"

echo "восьмеричное число = $oct" # 26

# Результат печатается в десятичном виде.

# --------- ------ -- -------