Искусство программирования на языке сценариев командной оболочки - страница 25

стр.

# Возвращает 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

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

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


# Шестнадцатиричное: числа начинаются с '0x' или '0X'

let "hex = 0x32"

echo "шестнадцатиричное число = $hex" # 50

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


# Другие основы счисления: ОСНОВА#ЧИСЛО

# ОСНОВА должна быть между 2 и 64.

# для записи ЧИСЛА должен использоваться соответствующий ОСНОВЕ диапазон символов,

# см. ниже.


let "bin = 2#111100111001101"

echo "двоичное число = $bin" # 31181


let "b32 = 32#77"

echo "32-ричное число = $b32" # 231


let "b64 = 64#@_"

echo "64-ричное число = $b64" # 4094

#

# Нотация ОСНОВА#ЧИСЛО может использоваться на ограниченном

#+ диапазоне основ счисления (от 2 до 64)

# 10 цифр + 26 символов в нижнем регистре + 26 символов в верхнем регистре + @ + _


echo


echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))

# 1295 170 44822 3375


# Важное замечание:

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

# Использование символов, для записи числа, выходящих за диапазо,

#+ соответствующий ОСНОВЕ счисления