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