Основные операторы Shell
Как и другие языки программирования, Shell поддерживает множество операторов, включая:
- Арифметические операторы
- Операторы отношения
- Логические операторы
- Строковые операторы
- Операторы проверки файлов
Изначально bash не поддерживает простые математические операции, но их можно реализовать через другие команды, такие как awk и expr; expr используется чаще всего.
expr — это инструмент вычисления выражений, который можно использовать для вычисления выражений.
Например, сложение двух чисел (Обратите внимание на использование обратных кавычек`, а не одинарных кавычек'):
Примеры
val=`expr 2 + 2`
echo Сумма двух чисел равна:$val"
Выполните скрипт, и результат вывода будет следующим:
两数之和为 : 4
Два момента, на которые следует обратить внимание:
- Между выражениями и операторами должны быть пробелы. Например, 2+2 неверно; это должно быть записано как 2 + 2. Это отличается от большинства знакомых нам языков программирования.
- Полное выражение должно быть заключено в` ``, обратите внимание, что этот символ — не часто используемая одинарная кавычка; он находится под клавишей Esc.
Арифметические операторы
В следующей таблице перечислены часто используемые арифметические операторы, предполагая, что переменная a равна 10, а переменная b равна 20:
| Operator | Описание | Пример |
|---|---|---|
| + | Сложение | `expr $a + $b` даёт 30. |
| - | Вычитание | `expr $a - $b` даёт -10. |
| * | Умножение | `expr $a \* $b` даёт 200. |
| / | Деление | `expr $b / $a` даёт 2. |
| % | Остаток от деления | `expr $b % $a` даёт 0. |
| = | Присваивание | a=$b присваивает переменной a значение переменной b. |
| == | Равно. Используется для сравнения двух чисел; возвращает true, если они одинаковы. | [ $a == $b ] возвращает false. |
| != | Не равно. Используется для сравнения двух чисел; возвращает true, если они не одинаковы. | [ $a != $b ] возвращает true. |
Примечание:Условные выражения должны быть заключены в квадратные скобки с пробелами, например:[$a==$b]неверно; это должно быть записано как[ $a == $b ]。
Примеры
Пример арифметических операторов выглядит следующим образом:
Примеры
# автор:Example
# url:www.example.com
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
затем
echo a равно b
fi
if [ $a != $b ]
затем
echo a не равно b
fi
Выполните скрипт, и результат вывода будет следующим:
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b
Примечание:
- Перед знаком умножения (*) должен стоять обратный слэш (\), чтобы выполнить умножение;
- if...then...fi — это условный оператор, который будет объяснён позже.
- На MAC синтаксис expr в shell таков:$((expression)), здесь символ '*' в выражении не нуждается в escape-символе '\'.
Операторы отношения
Операторы сравнения поддерживают только числа, а не строки, если только значение строки не является числом.
В следующей таблице перечислены часто используемые операторы сравнения, при условии, что переменная a равна 10, а переменная b равна 20:
| Operator | Описание | Пример |
|---|---|---|
| -eq | Проверяет, равны ли два числа; возвращает true, если равны. | [ $a -eq $b ] возвращает false. |
| -ne | Проверяет, не равны ли два числа; возвращает true, если они не равны. | [ $a -ne $b ] возвращает true. |
| -gt | Проверяет, больше ли число слева, чем число справа; если да, возвращает true. | [ $a -gt $b ] возвращает false. |
| -lt | Проверяет, меньше ли число слева, чем число справа; если да, возвращает true. | [ $a -lt $b ] возвращает true. |
| -ge | Проверяет, является ли число слева большим или равным числу справа; если да, возвращает true. | [ $a -ge $b ] возвращает false. |
| -le | Проверяет, является ли число слева меньшим или равным числу справа; если да, возвращает true. | [ $a -le $b ] возвращает true. |
Примеры
Пример операторов отношения выглядит следующим образом:
Примеры
# автор:Example
# url:www.example.com
a=10
b=20
if [ $a -eq $b ]
затем
echo "$a -eq $b: a равно b
else
echo "$a -eq $b: a не равно b
fi
if [ $a -ne $b ]
затем
echo "$a -ne $b: a не равно b
else
echo "$a -ne $b: a равно b
fi
if [ $a -gt $b ]
затем
echo "$a -gt $b: a больше b
else
echo "$a -gt $b: a не больше b
fi
if [ $a -lt $b ]
затем
echo "$a -lt $b: a меньше b
else
echo "$a -lt $b: a не меньше b
fi
if [ $a -ge $b ]
затем
echo "$a -ge $b: a больше или равно b
else
echo "$a -ge $b: a меньше b
fi
if [ $a -le $b ]
затем
echo "$a -le $b: a меньше или равно b
else
echo "$a -le $b: a больше b
fi
Выполните скрипт, и результат вывода будет следующим:
10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b
Логические операторы
В следующей таблице перечислены часто используемые логические операторы, предполагая, что переменная a равна 10, а переменная b равна 20:
| Operator | Описание | Пример |
|---|---|---|
| ! | Операция отрицания; возвращает false, если выражение истинно, иначе возвращает true. | [ ! false ] возвращает true. |
| -o | Операция OR; возвращает true, если хотя бы одно выражение истинно. | [ $a -lt 20 -o $b -gt 100 ] возвращает true. |
| -a | Операция AND; возвращает true, только если оба выражения истинны. | [ $a -lt 20 -a $b -gt 100 ] возвращает false. |
Примеры
Пример логических операторов выглядит следующим образом:
Примеры
# автор:Example
# url:www.example.com
a=10
b=20
if [ $a != $b ]
затем
echo "$a != $b: a не равно b
else
echo "$a == $b: a равно b
fi
if [ $a -lt 100 -a $b -gt 15 ]
затем
echo "$aменьше 100 и$bбольше 15 : возвращает true
else
echo "$aменьше 100 и$bбольше 15 : возвращает false
fi
if [ $a -lt 100 -o $b -gt 100 ]
затем
echo "$aменьше 100 или$bбольше 100 : возвращает true
else
echo "$aменьше 100 или$bбольше 100 : возвращает false
fi
if [ $a -lt 5 -o $b -gt 100 ]
затем
echo "$aменьше 5 или$bбольше 100 : возвращает true
else
echo "$aменьше 5 или$bбольше 100 : возвращает false
fi
Выполните скрипт, и результат вывода будет следующим:
10 != 20 : a 不等于 b 10 小于 100 且 20 大于 15 : 返回 true 10 小于 100 или 20 大于 100 : 返回 true 10 小于 5 или 20 大于 100 : 返回 false
Логические операторы
Далее описываются логические операторы Shell, предполагая, что переменная a равна 10, а переменная b равна 20:
| Operator | Описание | Пример |
|---|---|---|
| && | Логическое И | [[ $a -lt 100 && $b -gt 100 ]] возвращает false |
| || | Логическое ИЛИ | [[ $a -lt 100 || $b -gt 100 ]] возвращает true |
Примеры
Пример логических операторов выглядит следующим образом:
Примеры
# автор:Example
# url:www.example.com
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
затем
echo return true
else
echo return false
fi
if [[ $a -lt 100 || $b -gt 100 ]]
затем
echo return true
else
echo return false
fi
Выполните скрипт, вывод будет следующим:
返回 false 返回 true
Строковые операторы
В следующей таблице перечислены часто используемые строковые операторы, предполагая, что переменная a равна "abc", а переменная b — "efg":
| Operator | Описание | Пример |
|---|---|---|
| = | Проверяет, равны ли две строки; возвращает true, если они равны. | [ $a = $b ] возвращает false. |
| != | Проверяет, не равны ли две строки; возвращает true, если они не равны. | [ $a != $b ] возвращает true. |
| -z | Проверяет, равна ли длина строки 0; возвращает true, если она равна 0. | [ -z $a ] возвращает false. |
| -n | Проверяет, не равна ли длина строки 0; возвращает true, если она не равна 0. | [ -n "$a" ] возвращает true. |
| $ | Проверяет, не является ли строка пустой; возвращает true, если она не пуста. | [ $a ] возвращает true. |
Примеры
Пример строковых операторов выглядит следующим образом:
Примеры
# автор: Пример
# url:www.example.com
a="abc"
b="efg"
if [ $a = $b ]
затем
echo "$a = $b: a равно b"
else
echo "$a = $b: a не равно b"
fi
if [ $a != $b ]
затем
echo "$a != $b: a не равно b"
else
echo "$a != $b: a равно b"
fi
if [ -z $a ]
затем
echo "-z $a: длина строки равна 0"
else
echo "-z $a: длина строки не равна 0"
fi
if [ -n "$a" ]
затем
echo "-n $a: длина строки не равна 0"
else
echo "-n $a: длина строки равна 0"
fi
if [ $a ]
затем
echo "$a: строка не пуста"
else
echo "$a: строка пуста"
fi
Выполните скрипт, вывод будет следующим:
abc = efg: a 不等于 b abc != efg : a 不等于 b -z abc : 字符串长度不为 0 -n abc : 字符串长度不为 0 abc : 字符串不为空
Операторы проверки файлов
Операторы проверки файлов используются для проверки различных атрибутов файлов Unix.
Описания определения атрибутов приведены ниже:
| Operator | Описание | Пример |
|---|---|---|
| -b file | Проверить, является ли файл файлом блочного устройства; если да, вернуть true. | [ -b $file ] возвращает false. |
| -c file | Проверить, является ли файл файлом символьного устройства; если да, вернуть true. | [ -c $file ] возвращает false. |
| -d file | Проверить, является ли файл каталогом; если да, вернуть true. | [ -d $file ] возвращает false. |
| -f file | Проверить, является ли файл обычным файлом (ни каталогом, ни файлом устройства); если да, вернуть true. | [ -f $file ] возвращает true. |
| -g file | Проверить, установлен ли бит SGID на файле; если да, вернуть true. | [ -g $file ] возвращает false. |
| -k file | Проверить, установлен ли sticky-бит на файле; если да, вернуть true. | [ -k $file ] возвращает false. |
| -p file | Проверить, является ли файл именованным каналом; если да, вернуть true. | [ -p $file ] возвращает false. |
| -u file | Проверить, установлен ли бит SUID на файле; если да, вернуть true. | [ -u $file ] возвращает false. |
| -r file | Проверить, доступен ли файл для чтения; если да, вернуть true. | [ -r $file ] возвращает true. |
| -w file | Проверить, доступен ли файл для записи; если да, вернуть true. | [ -w $file ] возвращает true. |
| -x file | Проверить, является ли файл исполняемым; если да, вернуть true. | [ -x $file ] возвращает true. |
| -s file | Проверить, пуст ли файл (больше ли размер файла 0); вернуть true, если файл не пуст. | [ -s $file ] возвращает true. |
| -e file | Проверяет, существует ли файл (включая каталоги); если да, возвращает true. | [ -e $file ] возвращает true. |
Другие операторы проверки:
- -S: Проверяет, является ли файл сокетом.
- -L: Проверяет, существует ли файл и является ли он символической ссылкой.
Примеры
Переменная file представляет файл/var/www/example/test.sh, он имеет размер 100 байт и имеет права доступаrwx. Следующий код проверит различные атрибуты этого файла:
Примеры
# автор: Пример
# url:www.example.com
file="/var/www/example/test.sh"
if [ -r $file ]
затем
echo "Файл доступен для чтения"
else
echo "Файл недоступен для чтения"
fi
if [ -w $file ]
затем
echo "Файл доступен для записи"
else
echo "Файл недоступен для записи"
fi
if [ -x $file ]
затем
echo "Файл является исполняемым"
else
echo "Файл не является исполняемым"
fi
if [ -f $file ]
затем
echo "Файл является обычным файлом"
else
echo "Файл является специальным файлом"
fi
if [ -d $file ]
затем
echo "Файл является каталогом"
else
echo "Файл не является каталогом"
fi
if [ -s $file ]
затем
echo "Файл не пуст"
else
echo "Файл пуст"
fi
if [ -e $file ]
затем
echo "Файл существует"
else
echo "Файл не существует"
fi
Выполните скрипт, вывод будет следующим:
File is readable File is writable File is executable File is a regular file File is not a directory File is not empty File exists
Операторы инкремента и декремента
Хотя сам Shell не имеет операторов ++ и --, как в C, C++ или Java, ту же функциональность можно реализовать другими способами. Ниже приведены некоторые распространённые методы:
Использование команды let
letКоманда позволяет выполнять арифметические операции над целыми числами.
Примеры
# Инициализация переменных
num=5
# Инкремент
let num++
# Декремент
let num--
echo $num
Использование $(( )) для арифметических операций
$(( ))Этот синтаксис также является способом выполнения арифметических операций.
Примеры
# Инициализация переменных
num=5
# Инкремент
num=$((num + 1))
# Декремент
num=$((num - 1))
echo $num
Использование команды expr
exprКоманда может использоваться для арифметических операций, но в современных скриптах она не такletи$(( ))часто используется.
Примеры
# Инициализация переменных
num=5
# Инкремент
num=$(expr $num + 1)
# Декремент
num=$(expr $num - 1)
echo $num
Использование (( )) для арифметических операций
Подобно $(( )), синтаксис (( )) также можно использовать для арифметических операций.
Примеры
# Инициализация переменных
num=5
# Инкремент
((num++))
# Декремент
((num--))
echo $num
Примеры
Ниже приведён полный пример скрипта, демонстрирующий использование операций инкремента и декремента:
Примеры
# Инициализация переменных
num=5
echo "Начальное значение:$num"
# Инкремент
let num++
echo "После инкремента:$num"
# Декремент
let num--
echo "После декремента:$num"
# Использование $(( ))
num=$((num + 1))
echo "Использование$(( )) после инкремента:$num"
num=$((num - 1))
echo "Использование$(( )) после декремента:$num"
# Использование expr
num=$(expr $num + 1)
echo "Использование expr после инкремента:$num"
num=$(expr $num - 1)
echo "Использование expr после декремента:$num"
# Использование (( ))
((num++))
echo "Использование (( )) после инкремента:$num"
((num--))
echo "Использование (( )) после декремента:$num"
Запуск этого скрипта выведет следующее:
初始值: 5 自增后: 6 自减后: 5 使用 $(( )) 自增后: 6 使用 $(( )) 自减后: 5 使用 expr 自增后: 6 使用 expr 自减后: 5 使用 (( )) 自增后: 6 使用 (( )) 自减后: 5Другие расширения