Как использовать условия тестирования в сценарии Bash
В Linuxтестовое задание команда сравнивает один элемент с другим, но чаще используется в Сценарии оболочки BASH как часть условные утверждения которые управляют логикой и потоком программы.
Базовый пример
Попробуйте эти команды в окно терминала.
test 1 -eq 2 && echo "yes" || эхо "нет"
Вышеупомянутая команда разбивается следующим образом:
- тестовое задание: Команда для сравнения
- 1: Первый элемент, который вы собираетесь сравнить. В этом примере это число 1 но это может быть любое число или строка в кавычках.
- -экв: Метод сравнения. В этом случае вы проверяете, равно ли одно значение другому.
- 2: Элемент, с которым сравнивается первый элемент. В этом примере это число 2.
- &&: Ярлык Linux для последовательного объединения команд. Выходные данные тестовых цепочек для следующих команд. Двойной амперсанд выполняется, когда предшествующая ему команда имеет статус выхода 0, что является причудливым способом сказать, что команда не завершилась ошибкой.
-
эхо "да": Команда, запускаемая в случае успешного сравнения. В этом случае все, что мы делаем, это спрашиваем
- ||: В некотором смысле противоположность &&; двойной канал выполняется только в том случае, если предшествующая ему команда терпит неудачу (имеет статус выхода, отличный от 0).
- эхо "нет": Команда, запускаемая в случае неудачного сравнения.
Запускаем из командной строки, тестовое задание не возвращает значение в стандартный вывод, он просто возвращает код статуса выхода. Вот почему необходима цепочка команды echo.
По сути, команда сравнивает 1 с 2, и если они совпадают, выполняется инструкция echo "yes". который отображает «да», и если они не совпадают, выполняется оператор эхо «нет», который отображает "нет."
Сравнение чисел
Если вы сравниваете элементы, которые анализируются как числа, вы можете использовать следующие операторы сравнения:
- -eq: значение 1 равно значению 2
- -ge: значение 1 больше или равно значению 2
- -gt: значение 1 больше значения 2
- -le: значение 1 меньше или равно значению 2
- -lt: значение 1 меньше значения 2
- -ne: значение 1 не равно значению 2
Примеры тестов
test 1 -eq 2 && echo "yes" || эхо "нет"
(отображает "нет" на экране, потому что 1 не равно 2)
test 1 -ge 2 && echo "yes" || эхо "нет"
(отображает "нет" на экране, потому что 1 не больше и не равно 2)
test 1 -gt 2 && echo "yes" || эхо "нет"
(отображает "нет" на экране, потому что 1 не больше 2)
test 1 -le 2 && echo "yes" || эхо "нет"
(на экране отображается "да", потому что 1 меньше или равно 2)
test 1 -lt 2 && echo "yes" || эхо "нет"
(на экране отображается "да", потому что 1 меньше или равно 2)
test 1 -ne 2 && echo "yes" || эхо "нет"
(отображает "да" на экране, потому что 1 не равно 2)
Сравнение текста
Когда вы сравниваете элементы, которые анализируются как строки, используйте следующие операторы сравнения:
- =: строка 1 соответствует строке 2
- !=: строка 1 не соответствует строке 2
- -n: длина строки больше 0
- -z: длина строки равна 0
Примеры
test "string1" = "string2" && echo "yes" || эхо "нет"
(отображает "нет" на экране, потому что "строка1" не равна "строка2")
test "строка1"! = "строка2" && echo "yes" || эхо "нет"
(отображает на экране «да», потому что «строка1» не равна «строка2»)
test -n "string1" && echo "yes" || эхо "нет"
(на экране отображается «да», поскольку длина строки «string1» больше нуля)
test -z "string1" && echo "yes" || эхо "нет"
(отображает на экране "нет", поскольку длина строки "string1" больше нуля)
Сравнение файлов
При сравнении файлов используйте следующие операторы сравнения:
- -ef: Файлы имеют одинаковые номера устройств и индексов (это один и тот же файл)
- -nt: Первый файл новее, чем второй.
- -от: Первый файл старше второго.
- -b: Файл существует и блокировать специальные
- -c: Файл существует и особый характер
- -d: Файл существует и является каталогом
- -e: Файл существует
- -f: Файл существует и является обычным файлом
- -грамм: Файл существует и имеет указанный номер группы
- -ГРАММ: Файл существует и принадлежит группе пользователя.
- -час или -L: Файл существует и является символическая ссылка
- -k: Файл существует, и для него установлен липкий бит
- -O: Файл существует, вы являетесь владельцем
- -п: Файл существует и является именованным каналом
- -р: Файл существует и доступен для чтения
- -s: Файл существует и его размер больше нуля
- -S: Файл существует и является разъем
- -t: Дескриптор файла открывается на Терминал
- -u: Файл существует и установлен бит set-user-id
- -w: Файл существует и доступен для записи
- -Икс: Файл существует и является исполняемым
Примеры
test / path / to / file1 -nt / path / to / file2 && echo "да"
(Если файл1 новее, чем файл2, будет отображаться слово «да»)
test -e / path / to / file1 && echo "да"
(если file1 существует, будет отображаться слово "да")
test -O / path / to / file1 && echo "да"
(если у вас есть file1, то отображается слово "да" ")
Блокировать специальные: Файл является блочным устройством, что означает, что данные читаются блоками байтов. Обычно это файлы устройств, например жесткие диски.
Особый характер: Файл обрабатывается немедленно, когда вы пишете в него, и обычно это устройство, такое как последовательный порт.
Сравнение нескольких условий
До сих пор все сравнивали одно с другим, но что, если вы хотите сравнить два условия?
Например, если у животного четыре ноги, и оно «мычит», вероятно, это корова. Простая проверка на наличие четырех ног не гарантирует, что у вас есть корова, но проверка звука, который она издает, безусловно, дает.
Чтобы проверить оба условия одновременно, используйте следующую инструкцию:
test 4 -eq 4 -a "moo" = "moo" && echo "это корова" || эхо "это не корова"
Ключевой частью здесь является -а флаг, который обозначает а также.
Существует лучший и более часто используемый способ выполнения того же теста, а именно:
test 4 -eq 4 && test "moo" = "moo" && echo "это корова" || эхо "это не корова"
Следуй за ветками!
Ветвление тестовое задание команда имеет значение. Если первый тест (4 = 4) не прошел, тестовое задание команда завершается ненулевым кодом выхода. Таким образом, мы переходим к символу с двумя вертикальными линиями, и «это не корова» выводится на стандартный вывод. Однако, если первая проверка прошла успешно и, следовательно, тестовое задание приводит к коду выхода 0, затем переходим к первому двойному амперсанду. Это следующее утверждение - еще одно условие проверки!
Если второй тест не удается, мы снова переходим к дабл-пайпу и продолжаем оттуда. Если, однако, второй тест проходит успешно, мы переходим ко второму оператору с двойным амперсандом, который в этот пример просто выводит на стандартный вывод "это корова", а затем возвращается к оболочке. незамедлительный.
Другой тест сравнивает два утверждения, и если одно из них истинно, вывести строку. Например, чтобы проверить, существует ли файл с именем file1.txt или файл с именем file1.doc, вы можете использовать следующую команду:
test -e file1.txt -o -e file1.doc && echo «файл1 существует» || echo "file1 не существует"
Ключевой частью здесь является -о что означает или.
Существует лучший и более часто используемый способ выполнения того же теста, а именно:
test -e file1.txt || test -e file1.doc && echo «файл1 существует» || echo "file1 не существует"
Удаление тестового ключевого слова
На самом деле вам не нужно использовать слово тестовое задание для сравнения. Все, что вам нужно сделать, это заключить заявление в квадратные скобки следующим образом:
[-e file1.txt] && echo «файл1 существует» || echo "file1 не существует"
В [ а также ] в основном означает то же, что и тестовое задание.
Теперь вы знаете, что можете улучшить сравнение нескольких условий следующим образом:
[4 -eq 4] && ["moo" = "moo"] && echo "это корова" || эхо "это не корова"
[-e file1.txt] || [-e file1.doc] && echo «файл1 существует» || echo "file1 не существует"
Резюме
Команда test более полезна в сценариях, потому что вы можете проверить значение одной переменной относительно другой и управлять ходом выполнения программы. В командной строке используйте его, чтобы проверить, существует ли файл или нет.