Как использовать условия теста в скрипте Bash

Команду test можно использовать в командной строке Linux для сравнения одного элемента с другим, но она чаще используется в сценариях оболочки BASH как часть условных операторов, управляющих логикой и ходом программы.

Основной пример

Вы можете попробовать эти команды, просто открыв окно терминала.

тест 1-экв 2  эхо "да" || эхо "нет"

Вышеприведенная команда может быть разбита следующим образом:

  • test — это означает, что вы собираетесь выполнить сравнение
  • 1 — первый элемент, который вы собираетесь сравнить
  • -eq — Как вы сравниваете. В этом случае вы проверяете, равно ли одно число другому.
  • 2 — Элемент, с которым вы сравниваете первый элемент 
  • — Выполните следующую инструкцию, если результат верен
  • echo «yes» — команда для запуска, если сравнение возвращает true
  • || — Запустите следующую инструкцию, если результат ложен
  • echo «no» — команда для запуска, если сравнение возвращает false

По сути, команда сравнивает от 1 до 2, и, если они совпадают, выполняется оператор echo «yes», который отображает «yes», а если они не совпадают, выполняется оператор echo «no», который отображает «no».

Сравнение чисел

Если вы сравниваете элементы, которые анализируются как числа, вы можете использовать следующие операторы сравнения:

  • -eq — делает значение 1 равным значению 2
  • -ge — значение 1 больше или равно значению 2
  • -gt — значение 1 больше значения 2
  • -le — значение 1 меньше или равно значению 2
  • -lt — значение 1 меньше значения 2
  • -ne — значение 1 не равно значению 2

Примеры

тест 1-экв 2  эхо "да" || эхо "нет"

(отображает «нет» на экране, потому что 1 не равно 2)

тест 1-2  эхо "да" || эхо "нет"

(отображает «нет» на экране, потому что 1 не больше или равно 2)

тест 1 -гт 2  эхо "да" || эхо "нет"

(на экране отображается «нет», потому что 1 не больше 2)

тест 1-ле 2  эхо "да" || эхо "нет"

(отображает «да» на экране, потому что 1 меньше или равно 2)

тест 1-лт 2  эхо "да" || эхо "нет"

(отображает «да» на экране, потому что 1 меньше или равно 2)

тест 1 -не 2  эхо "да" || эхо "нет"

(отображает «да» на экране, потому что 1 не равно 2)

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

Если вы сравниваете элементы, которые анализируются как строки, вы можете использовать следующие операторы сравнения:

  • = — соответствует ли строка 1 строке 2
  • != — строка 1 отличается от строки 2
  • -n — длина строки больше 0
  • -z — длина строки 0

Примеры

test "string1" = "string2"  эхо "да" || эхо "нет"

(выводит «no» на экран, потому что «string1» не равно «string2»)

test "string1"! = "string2"  эхо "да" || эхо "нет"

(выводит «yes» на экран, потому что «string1» не равно «string2»)

test -n "string1"  эхо "да" || эхо "нет"

(отображает «да» на экране, потому что «строка1» имеет длину строки больше нуля)

test -z "string1"  эхо "да" || эхо "нет"

(отображает «нет» на экране, потому что «строка1» имеет длину строки больше нуля)

Сравнение файлов

Если вы сравниваете файлы, вы можете использовать следующие операторы сравнения:

  • -ef — У файлов одинаковые номера устройств и индексов (это один и тот же файл)
  • -NT — первый файл новее, чем второй файл
  • -ot — первый файл старше, чем второй файл
  • -b — файл существует и является специальным блоком
  • -c — файл существует и является символьным
  • -d — файл существует и является каталогом
  • -e — файл существует
  • -f — файл существует и является обычным файлом
  • -g — файл существует и имеет указанный номер группы
  • -G — файл существует и является владельцем группы пользователей
  • -h — файл существует и является символической ссылкой
  • -k — файл существует, и в нем установлен липкий бит
  • -L — так же, как -h
  • -O — файл существует, вы являетесь владельцем
  • -p — файл существует и является именованным каналом
  • -r — файл существует и доступен для чтения
  • -s — файл существует и имеет размер больше нуля
  • -S — файл существует и является сокетом
  • -t — дескриптор файла открывается на терминале
  • -u — файл существует и бит set-user-id установлен
  • -w — файл существует и доступен для записи
  • -x — файл существует и является исполняемым

Примеры

test / path / to / file1 -nt / path / to / file2  эхо "да"

(Если файл1 новее, чем файл2, то будет отображаться слово «да»)

test -e / path / to / file1  эхо "да"

(если файл1 существует, будет отображено слово «да»)

test -O / path / to / file1  эхо "да"

(если у вас есть файл1, тогда появится слово «да»)

терминология

  • Специальный блок — файл является блочным устройством, что означает, что данные читаются в байтах. Обычно это файлы устройств, такие как жесткие диски.
  • Специальный символ — файл обрабатывается сразу же, когда вы пишете в него, и обычно это устройство, такое как последовательный порт

Сравнение нескольких условий

До сих пор все сравнивали одно с другим, но что, если вы хотите сравнить два условия?

Например, если животное имеет 4 ноги и говорит «му», это, вероятно, корова. Простая проверка на 4 ноги не гарантирует, что у вас есть корова, но проверка звука, который она делает, обязательно делает.

Чтобы проверить оба условия сразу, используйте следующее утверждение:

test 4 -eq 4 -a "moo" = "moo"  эхо "это корова" || эхо "это не корова"

Ключевой частью здесь является -a, который обозначает и.

Существует лучший и наиболее часто используемый способ выполнения одного и того же теста, а именно:

тест 4 -экв 4  test "moo" = "moo"  эхо "это корова" || эхо "это не корова"

Еще один тест, который вы, возможно, захотите сделать, — это сравнение двух операторов и, если они верны, выведите строку Например, если вы хотите проверить, существует ли файл с именем «file1.txt» или существует файл с именем «file1.doc», вы можете использовать следующую команду:

test -e file1.txt -o -e file1.doc  эхо "файл1 существует" || echo "file1 не существует"

Ключевой частью здесь является -o, который обозначает или.

Существует лучший и наиболее часто используемый способ выполнения одного и того же теста, а именно:

test -e file1.txt || test -e file1.doc  эхо "файл1 существует" || echo "file1 не существует"

Исключение тестового ключевого слова

Вам на самом деле не нужно использовать слово test для сравнения. Все, что вам нужно сделать, это заключить утверждение в квадратные скобки следующим образом:

[-e file1.txt]  эхо "файл1 существует" || echo "file1 не существует"

[И] в основном означает то же самое, что и test.

Теперь вы знаете, что вы можете улучшить сравнение нескольких условий следующим образом:

[4 -экв. 4]  ["moo" = "moo"]  эхо "это корова" || эхо "это не корова"
[-e file1.txt] || [-e file1.doc]  эхо "файл1 существует" || echo "file1 не существует"

Резюме

Команда test более полезна в сценариях, поскольку вы можете проверить значение одной переменной относительно другой и управлять потоком программ. В стандартной командной строке вы можете использовать ее, чтобы проверить, существует файл или нет.

Ссылка на основную публикацию