Скобки в Shell (включая одинарные скобки и двойные скобки) могут использоваться для проверки определённых условий:

  • Арифметическое сравнение, например, равна ли переменная 0,[ $var -eq 0 ]。
  • Проверка атрибутов файла, например, существует ли файл,[ -e $var ], является ли он каталогом,[ -d $var ]。
  • Сравнение строк, например, совпадают ли две строки,[[ $var1 = $var2 ]]。

[] часто можно заменить командой test, которая будет рассмотрена позже.

Арифметическое сравнение

Выполните проверку арифметических условий для переменных или значений:

[ $var -eq 0 ]  # 当 $var 等于 0 时,返回真
[ $var -ne 0 ]  # 当 $var 不等于 0 时,返回真

Обратите внимание, что между [ и ] и операндами должен быть пробел, иначе будет выдана ошибка. Например, следующий пример вызовет ошибку:

[$var -eq 0 ]  или  [ $var -ne 0] 

Другие операторы сравнения:

Operator Значение
-gt Больше
-lt Меньше
-ge Больше или равно
-le Меньше или равно

Можно объединять несколько условий для проверки с помощью -a (и) или -o (или):

[ $var1 -ne 0 -a $var2 -gt 2 ]  # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ]  # 使用逻辑或 -o

Проверка атрибутов файловой системы

Используйте различные флаги условий для проверки различных атрибутов файловой системы.

Operator Значение
[ -f $file_var ] Возвращает true, если переменная $file_var является обычным путём к файлу или именем файла (файл)
[ -x $var ] Возвращает true, если файл, указанный в переменной $var, является исполняемым (выполнение)
[ -d $var ] Возвращает true, если файл, указанный в переменной $var, является каталогом (каталог)
[ -e $var ] Возвращает true, если файл, указанный в переменной $var, существует (существование)
[ -c $var ] Возвращает true, если файл, указанный в переменной $var, является путём к файлу символьного устройства (символьное устройство)
[ -b $var ] Возвращает true, если файл, указанный в переменной $var, является путём к файлу блочного устройства (блочное устройство)
[ -w $var ] Возвращает true, если файл, указанный в переменной $var, доступен для записи (запись)
[ -r $var ] Возвращает true, если файл, указанный в переменной $var, доступен для чтения (чтение)
[ -L $var ] Возвращает true, если файл, указанный в переменной $var, является символической ссылкой (ссылка)

Способ использования следующий:

fpath="/etc/passwd"
if [ -e $fpath ]; then
  echo File exits;
else
  echo Does not exit;
fi

Сравнение строк

При сравнении строк лучше всего использовать двойные квадратные скобки [[ ]]. Поскольку одинарные квадратные скобки могут вызвать некоторые ошибки, лучше их избегать.

Проверьте, совпадают ли две строки:

[[ $str1 = $str2 ]]

Возвращает true, когда str1 равно str2. То есть текст, содержащийся в str1 и str2, одинаков. Одинарный знак равенства также можно записать как двойной знак равенства, то есть приведённое выше сравнение строк эквивалентно [[ $str1 == $str2 ]].

Обратите внимание, что перед и после = есть пробел. Если вы забудете добавить пробел, это станет оператором присваивания, а не сравнением.

Другие случаи сравнения строк:

Operator Значение
[[ $str1 != $str2 ]] Возвращает true, если str1 и str2 не совпадают
[[ -z $str1 ]] Возвращает true, если str1 — пустая строка
[[ -n $str1 ]] Возвращает true, если str1 — непустая строка

Используя логические операторы && и ||, можно легко комбинировать несколько условий, например:

str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
  echo str1 is nonempty and str2 is empty string.
fi

Команду test также можно использовать для проверки условий. Использование test позволяет избежать использования слишком большого количества скобок. Условия test в [] также можно реализовать с помощью test.

if [ $var -eq 0 ]; then echo "True"; fi

Эквивалентно:

if test $var -eq 0; then echo "True"; fi

Автор: liuchengxu_

Оригинал: https://blog.csdn.net/simple_the_best/article/details/75915767