Практическое написание сценариев командной оболочки Bash/Bash подстановки: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 35:
 
== Арифметические подстановки ==
 
Для выполнения арифметических вычислений в командной оболочке служат две команды: <code>let</code> и <code>expr</code>. Тем не менее, Bash позволяет выполнять вычисления и без их применения с помощью арифметической подстановки:
<source lang=bash>
$((выражение))
</source>
Примеры
<source lang=bash>
N1=2
N2=3
N3=26
N4=7
N5=-8
 
# Математические вычисления
echo "$N1 + $N2 = $((N1 + N2))" # сложение
echo "$N1 - $N2 = $((N1 - N2))" # вычитание
echo "$N1 * $N2 = $((N1 * N2))" # умножение
echo "$N1 ** $N2 = $((N1 ** N2))" # возведение в степень
echo "$N3 / $N4 = $((N3 / N4))" # деление
echo "$N3 % $N4 = $((N3 % N4))" # остаток от деления
 
# Унарные операторы
echo "-($N5) = $((-N5))" # унарный минус
echo "+($N5) = $((+N5))" # унарный плюс
 
TRUE=0
FALSE=1
 
# Булевы операторы
echo "!$TRUE = $((!TRUE))" # отрицание
echo "!$FALSE = $((!FALSE))"
echo "!$FALSE = $((!FALSE))"
echo "$TRUE && $FALSE = $((TRUE && FALSE))" # конъюнкция
echo "$TRUE || $FALSE = $((TRUE || FALSE))" # дизъюнкция
 
NN1=222
NN2=141
# Поразрядные операции
echo "$(echo "obase=2;$NN1" | bc) & $(echo "obase=2;$NN2" | bc) = $(echo "obase=2; $((NN1 & NN2))" | bc)" # поразрядное И
echo "$(echo "obase=2;$NN1" | bc) | $(echo "obase=2;$NN2" | bc) = $(echo "obase=2; $((NN1 | NN2))" | bc)" # поразрядное ИЛИ
echo "$(echo "obase=2;$NN1" | bc) ^ $(echo "obase=2;$NN2" | bc) = $(echo "obase=2; $((NN1 ^ NN2))" | bc)" # поразрядное исключающее ИЛИ
echo "~15 = $((~15))" # поразрядное отрицание
 
NN1=1
# Поразрядные сдвиги
echo "$(printf "%04d" $(echo "obase=2;$NN1" | bc)) << 3 = $(echo "obase=2; $((NN1 << 3))" | bc)" # поразрядный сдвиг влево
NN1=8
echo "$(printf "%04d" $(echo "obase=2;$NN1" | bc)) >> 2 = $(printf "%04d" $(echo "obase=2; $((NN1 >> 2))" | bc))" # поразрядный сдвиг вправо
 
# Инкремент
echo "N1 = $N1"
echo "N1 = ++$N1 = $((++N1))" # префиксный инкремент: увеличить на единицу, присвоить и вывести
echo "N1 = $N1"
echo "N1 = $N1++ = $((N1++))" # постфиксный инкремент: вывести, увеличить на единицу и присвоить
echo "N1 = $N1"
 
# Декремент
echo "N1 = --$N1 = $((--N1))" # префиксный декремент: уменьшить на единицу, присвоить и вывести
echo "N1 = $N1"
echo "N1 = $N1-- = $((N1--))" # постфиксный инкремент: вывести, уменьшить на единицу и присвоить
echo "N1 = $N1"
 
# Сравнивание чисел
echo "$N1 > $N2 = $((N1 > N2))"
echo "$N1 >= $N2 = $((N1 >= N2))"
echo "$N1 < $N2 = $((N1 <= N2))"
echo "$N1 == $N2 = $((N1 == N2))"
echo "$N1 != $N2 = $((N1 != N2))"
 
# Тернарная операция
echo "N1 = $N1, N2 = $N2"
echo "$((N1 > N2 ? N1 + N2 : N1 - N2))"
 
# Несколько выражений в одном
echo "$((N1 = 1 , N += 8, N *= 2, N--))"
 
# Следующие операторы также имеют форму с присваиванием
# *= /= %= += -= <<= >>= &= ^= |=
echo "N1 = $N1"
echo $(( N1 *= 2 ))
echo $(( N1 /= 3 ))
echo $(( N1 %= 10 ))
echo $(( N1 += 25 ))
echo $(( N1 -= 6 ))
echo $(( N1 <<= 2 ))
echo $(( N1 >>= 3 ))
echo $(( N1 &= 255 ))
echo $(( N1 ^= 255 ))
echo $(( N1 |= 255 ))
</source>
Результаты
<source lang=bash>
2 + 3 = 5
2 - 3 = -1
2 * 3 = 6
2 ** 3 = 8
26 / 7 = 3
26 % 7 = 5
-(-8) = 8
+(-8) = -8
!0 = 1
!1 = 0
!1 = 0
0 && 1 = 0
0 || 1 = 1
11011110 & 10001101 = 10001100
11011110 | 10001101 = 11011111
11011110 ^ 10001101 = 1010011
~15 = -16
0001 << 3 = 1000
1000 >> 2 = 0010
N1 = 2
N1 = ++2 = 3
N1 = 3
N1 = 3++ = 3
N1 = 4
N1 = --4 = 3
N1 = 3
N1 = 3-- = 3
N1 = 2
2 > 3 = 0
2 >= 3 = 0
2 < 3 = 1
2 == 3 = 0
2 != 3 = 1
N1 = 2, N2 = 3
-1
16
N1 = 1
2
0
0
25
19
76
9
9
246
255
</source>
 
== Подстановочные операции ==