Як використовувати умови тестування в сценарії Bash

The Linuxвипробування команда порівнює один елемент з іншим, але вона частіше використовується в Скрипти оболонки BASH як частина умовні висловлювання які контролюють логіку та хід програми.

Основний приклад

тестовий приклад

Спробуйте виконати ці команди вікно терміналу.

тест 1 -eq 2 && echo "так" || відлуння "ні"

Наведена вище команда розбивається так:

  • випробування: Команда для виконання порівняння
  • 1:Перший елемент, який ви збираєтеся порівняти. У цьому прикладі це число 1 але це може бути будь-яке число або рядок у лапках.
  • -екв: Метод порівняння. У цьому випадку ви перевіряєте, чи дорівнює одне значення іншому.
  • 2: елемент, з яким ви порівнюєте перший елемент. У цьому прикладі це число 2.
  • &&: ярлик Linux для послідовного з’єднання команд. Вихідні дані з тестових ланцюжків для команд, які слідують. Подвійний амперсанд виконується, коли команда, що передує йому, має статус виходу 0, що є химерним способом сказати, що команда не завершилася.
  • луна "так":Команда для запуску, якщо порівняння пройшло успішно. У цьому випадку все, що ми робимо, це запитуємо
    відлуння команду, щоб надрукувати слово "так" у стандартному виводі, але тут можна запустити будь-яку команду, яка буде виконана, якщо результат тесту виявиться правдивим.
  • ||: Певною мірою навпаки &&; подвійний канал виконується лише в тому випадку, якщо команда, що передує йому, зазнає невдачі (має статус виходу, який не дорівнює 0).
  • відлуння "ні": Команда для запуску, якщо порівняння не вдалось.

Запустити з підказки оболонки, випробування не повертає значення до стандартного виводу, він просто повертає код статусу виходу. Ось чому необхідна ланцюжок команди echo.

статус тестового виходу

По суті, команда порівнює 1 з 2, і якщо вони збігаються, виконується оператор echo "yes" який відображає "так", і якщо вони не збігаються, виконується оператор echo "no", який відображає "немає."

Порівняння чисел

Якщо ви порівнюєте елементи, які аналізуються як числа, ви можете використовувати такі оператори порівняння:

  • -екв: значення 1 дорівнює значенню 2
  • -ge: значення 1 більше або дорівнює значенню 2
  • -gt: значення 1 більше, ніж значення 2
  • -ле: значення 1 менше або дорівнює значенню 2
  • -lt: значення 1 менше значення 2
  • -не: значення 1 не дорівнює значенню 2

Приклад тестів

тест 1 -eq 2 && echo "так" || відлуння "ні"

(на екрані відображається «ні», оскільки 1 не дорівнює 2)

тест 1 -ge 2 && echo "так" || відлуння "ні"

(на екрані відображається «ні», оскільки 1 не більше або не дорівнює 2)

тест 1 -gt 2 && echo "так" || відлуння "ні"

(на екрані відображається «ні», оскільки 1 не більше 2)

тест 1 -le 2 && echo "так" || відлуння "ні"

(на екрані відображається «так», оскільки 1 менше або дорівнює 2)

тест 1 -lt 2 && echo "так" || відлуння "ні"

(на екрані відображається «так», оскільки 1 менше або дорівнює 2)

тест 1 -ne 2 && echo "так" || відлуння "ні"

(відображає на екрані "так", тому що 1 не дорівнює 2)

Порівняння тексту

Коли ви порівнюєте елементи, які аналізуються як рядки, використовуйте такі оператори порівняння:

  • =: рядок 1 відповідає рядку 2
  • !=: рядок 1 не відповідає рядку 2
  • -n: довжина рядка більше 0
  • -z: довжина рядка дорівнює 0

Приклади

test "string1" = "string2" && echo "yes" || відлуння "ні"

(на екрані відображається «ні», оскільки «рядок1» не дорівнює «рядку2»)

test "string1" != "string2" && echo "yes" || відлуння "ні"

(відображає на екрані "так", оскільки "рядок1" не дорівнює "рядку2")

test -n "рядок1" && echo "так" || відлуння "ні"

(відображає на екрані "так", оскільки "рядок1" має довжину рядка більше нуля)

test -z "рядок1" && echo "так" || відлуння "ні"

(відображає на екрані «ні», оскільки «string1» має довжину рядка більше нуля)

Порівняння файлів

Коли ви порівнюєте файли, використовуйте такі оператори порівняння:

  • -еф: файли мають однакові номери пристроїв та індексних дескрипторів (чи це той самий файл)
  • -nt: перший файл новіший за другий файл
  • -от: перший файл старший за другий файл
  • : файл існує і є блок спец
  • -c: файл існує і є характер особливий
  • -d: файл існує і є каталогом
  • : файл існує
  • -f: файл існує і є звичайним файлом
  • : файл існує і має вказаний номер групи
  • : файл існує та є власником групи користувачів
  • -h або : файл існує і є a символічне посилання
  • : файл існує і має встановлений біт
  • : файл існує, ви є власником
  • -стр: файл існує і є іменованим каналом
  • -r: файл існує і його можна читати
  • -s: файл існує і має розмір більше нуля
  • : файл існує і є a розетка
  • : дескриптор файлу відкривається на a термінал
  • -u: файл існує і встановлено біт set-user-id
  • -w: файл існує і доступний для запису
  • -x: файл існує і є виконуваним

Приклади

test /path/to/file1 -nt /path/to/file2 && echo "так"

(Якщо файл1 новіший за файл2, то буде відображатися слово "так")

test -e /path/to/file1 && echo "так"

(якщо файл1 існує, буде відображатися слово "так")

test -O /шлях/до/файлу1 && echo "так"

(якщо у вас є файл1, відображається слово "так")

Блок спец: Файл є блоковим пристроєм, що означає, що дані зчитуються блоками байтів. Зазвичай це файли пристроїв, наприклад жорсткі диски.

Особливий характер: файли діють негайно, коли ви пишете в нього, і зазвичай це такий пристрій, як послідовний порт

Порівняння кількох умов

Досі все порівнювало одне з іншим, але що, якщо ви хочете порівняти дві умови?

Наприклад, якщо тварина має чотири ноги і «мукає», це, ймовірно, корова. Проста перевірка наявності чотирьох ніг не гарантує, що у вас є корова, але перевірка звуку, який вона видає, безсумнівно.

Щоб перевірити обидві умови одночасно, скористайтеся таким твердженням:

тест 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 "файл 1 не існує"

Ключовою частиною тут є що означає або.

Існує кращий і більш поширений спосіб виконання того ж тесту, а саме:

test -e file1.txt || test -e file1.doc && echo "файл1 існує" || echo "файл 1 не існує"

Видалення ключового слова Test

Вам насправді не потрібно вживати це слово випробування виконати порівняння. Все, що вам потрібно зробити, це помістити заяву в квадратні дужки так:

[ -e file1.txt ] && echo "файл1 існує" || echo "файл 1 не існує"

The [ і ] в основному означає те саме, що випробування.

Тепер ви знаєте, що ви можете покращити порівняння кількох умов наступним чином:

[ 4 -eq 4 ] && [ "moo" = "moo" ] && echo "це корова" || луна "це не корова"
[ -e файл1.txt ] || [ -e file1.doc ] && echo "файл1 існує" || echo "файл 1 не існує"

Резюме

Команда test є більш корисною в сценаріях, оскільки ви можете перевірити значення однієї змінної проти іншої та контролювати хід програми. У командному рядку використовуйте його, щоб перевірити, чи існує файл чи ні.