Основные операторы Shell

Как и другие языки программирования, Shell поддерживает множество операторов, включая:

  • Арифметические операторы
  • Операторы отношения
  • Логические операторы
  • Строковые операторы
  • Операторы проверки файлов

Изначально bash не поддерживает простые математические операции, но их можно реализовать через другие команды, такие как awk и expr; expr используется чаще всего.

expr — это инструмент вычисления выражений, который можно использовать для вычисления выражений.

Например, сложение двух чисел (Обратите внимание на использование обратных кавычек`, а не одинарных кавычек'):

Примеры

#!/bin/bash

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 ]。

Примеры

Пример арифметических операторов выглядит следующим образом:

Примеры

#!/bin/bash
# автор: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.

Примеры

Пример операторов отношения выглядит следующим образом:

Примеры

#!/bin/bash
# автор: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.

Примеры

Пример логических операторов выглядит следующим образом:

Примеры

#!/bin/bash
# автор: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

Примеры

Пример логических операторов выглядит следующим образом:

Примеры

#!/bin/bash
# автор: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.

Примеры

Пример строковых операторов выглядит следующим образом:

Примеры

#!/bin/bash
# автор: Пример
# 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. Следующий код проверит различные атрибуты этого файла:

Примеры

#!/bin/bash
# автор: Пример
# 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Команда позволяет выполнять арифметические операции над целыми числами.

Примеры

#!/bin/bash

# Инициализация переменных
num=5

# Инкремент
let num++

# Декремент
let num--

echo $num

Использование $(( )) для арифметических операций

$(( ))Этот синтаксис также является способом выполнения арифметических операций.

Примеры

#!/bin/bash

# Инициализация переменных
num=5

# Инкремент
num=$((num + 1))

# Декремент
num=$((num - 1))

echo $num

Использование команды expr

exprКоманда может использоваться для арифметических операций, но в современных скриптах она не такletи$(( ))часто используется.

Примеры

#!/bin/bash

# Инициализация переменных
num=5

# Инкремент
num=$(expr $num + 1)

# Декремент
num=$(expr $num - 1)

echo $num

Использование (( )) для арифметических операций

Подобно $(( )), синтаксис (( )) также можно использовать для арифметических операций.

Примеры

#!/bin/bash

# Инициализация переменных
num=5

# Инкремент
((num++))

# Декремент
((num--))

echo $num

Примеры

Ниже приведён полный пример скрипта, демонстрирующий использование операций инкремента и декремента:

Примеры

#!/bin/bash

# Инициализация переменных
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
Другие расширения