echo "a = $a" # a = -2147483648
# ОШИБКА! (выход за границы диапазона)
Bash ничего не знает о существовании чисел с плавающей запятой. Такие числа, из-за наличия символа десятичной точки, он воспринимает как строки.
let "b = $a + 1.3" # Ошибка.
# t2.sh: let: b = 1.5 + 1.3: syntax error in expression (error token is ".5 + 1.3")
Для работы с числами с плавающей запятой в сценариях можно использовать утилиту-калькулятор bc.
битовые операции. Битовые операции очень редко используются в сценариях командного интерпретатора. Их главное назначение, на мой взгляд, установка и проверка некоторых значений, читаемых из портов ввода-вывода и сокетов. "Битовые операции" гораздо более уместны в компилирующих языках программирования, таких как C и C++.
сдвигает на 1 бит влево (умножение на 2)
let "var <<= 2" значение переменной var сдвигается влево на 2 бита (умножается на 4)
сдвиг вправо на 1 бит (деление на 2)
"сдвиг-вправо-равно" (имеет смысл обратный <<=)
по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
"по-битовое ИСКЛЮЧАЮЩЕЕ-ИЛИ-равно"
if [ $condition1 ] && [ $condition2 ]
# То же самое, что: if [ $condition1 -a $condition2 ]
# Возвращает true если оба операнда condition1 и condition2 истинны...
if [[ $condition1 && $condition2 ]] # То же верно
# Обратите внимание: оператор && не должен использоваться внутри [ ... ].
оператор &&, в зависимости от контекста, может так же использоваться в И-списках для построения составных команд.
if [ $condition1 ] || [ $condition2 ]
# То же самое, что: if [ $condition1 -o $condition2 ]
# Возвращает true если хотя бы один из операндов истинен...
if [[ $condition1 || $condition2 ]] # Also works.
# Обратите внимание: оператор || не должен использоваться внутри [ ... ].
Bash производит проверку кода возврата КАЖДОГО из операндов в логических выражениях.
Пример 8-3. Построение сложных условий, использующих && и ||
if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]
echo "Первая проверка прошла успешно."
echo "Первая проверка не прошла."
# ОКА: 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 ]
echo "Вторая проверка прошла успешно."
echo "Вторая проверка не прошла."
# Опции -a и -o предоставляют
#+ альтернативный механизм проверки условий.
# Спасибо Patrick Callahan.
if [ "$a" -eq 24 -a "$b" -eq 47 ]
echo "Третья проверка прошла успешно."
echo "Третья проверка не прошла."
if [ "$a" -eq 98 -o "$b" -eq 47 ]
echo "Четвертая проверка прошла успешно."
echo "Четвертая проверка не прошла."
if [ "$a" = rhino ] && [ "$b" = crocodile ]
echo "Пятая проверка прошла успешно."