Перейти до змісту

Bash - Тести


Цілі: В цьому розділі ви дізнаєтеся як:

✔ працювати з кодом повернення;
✔ перевірити та порівняти файли;
✔ перевірити змінні, рядки та цілі числа;
✔ виконати операцію з цілими числами;

🏁 linux, сценарій, bash, змінна

Знання: ⭐ ⭐
Складність: ⭐ ⭐ ⭐

Час для читання: 10 хвилин


Після завершення всі команди, які виконує оболонка, повертають код повернення (також називається статус або код виходу).

  • Якщо команда виконана правильно, код стану буде нульовим.
  • Якщо під час виконання команди виникла проблема, її код стану матиме ненульове значення. На це є багато причин: відсутність прав доступу, відсутність файлу, неправильне введення тощо.

Вам слід звернутися до посібника з команди man, щоб дізнатися про різні значення коду повернення, наданого розробниками.

Код повернення не відображається безпосередньо, але зберігається в спеціальній змінній: $?.

mkdir directory
echo $?
0
mkdir /directory
mkdir: unable to create directory
echo $?
1
command_that_does_not_exist
command_that_does_not_exist: command not found
echo $?
127

Примітка

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

Підказка

Оскільки значення $? змінюється після кожного виконання команди, краще помістити його значення в змінну, яка буде використовуватися згодом, для перевірки або для відображення повідомлення.

ls no_file
ls: cannot access 'no_file': No such file or directory
result=$?
echo $?
0
echo $result
2

Також можна створити коди повернення в сценарії. Для цього вам просто потрібно додати числовий аргумент до команди exit.

bash # to avoid being disconnected after the "exit 2
exit 123
echo $?
123

Крім правильного виконання команди, оболонка пропонує можливість запускати тести на багатьох шаблонах:

  • Файли: існування, тип, права, порівняння;
  • Рядки: довжина, порівняння;
  • Числові цілі числа: значення, порівняння.

Результат тесту:

  • $?=0 : тест було виконано правильно та відповідає дійсності;
  • $?=1 : тест було виконано правильно та є помилковим;
  • $?=2: тест виконано неправильно.

Тестування типу файлу

Синтаксис команди test для файлу:

test [-d|-e|-f|-L] file

або:

[ -d|-e|-f|-L file ]

ВАЖЛИВО

Зверніть увагу, що після [ і перед ] є пробіл.

Параметри команди перевірки файлів:

Опція Функціональність
-e Перевіряє, чи існує файл
-f Перевіряє, чи файл існує та має звичайний тип
-d Перевіряє, чи файл існує та має тип каталогу
-L Перевіряє, чи файл існує та має тип символічного посилання
-b Перевіряє, чи існує файл і чи він у режимі блокування спеціального типу
-c Перевіряє, чи існує файл і чи він у режимі символів спеціального типу
-p Перевіряє, чи файл існує та має тип named pipe (FIFO)
-S Перевіряє, чи файл існує та має тип socket
-t Перевіряє, чи файл існує та має типу terminal
-r Перевіряє, чи існує файл і чи його можна прочитати
-w Перевіряє, чи файл існує та доступний для запису
-x Перевіряє, чи файл існує та є виконуваним
-g Перевіряє, чи існує файл і чи має встановлений SGID
-u Перевіряє, чи існує файл і чи має встановлений SUID
-s Перевіряє, чи файл існує та чи він непорожній (розмір > 0 байтів)

Приклад:

test -e /etc/passwd
echo $?
0
[ -w /etc/passwd ]
echo $?
1

Було створено внутрішню команду для деяких оболонок (включаючи bash), яка є сучаснішою та надає більше можливостей, ніж зовнішня команда test.

[[ -s /etc/passwd ]]
echo $?
1

Важливо

Тому ми будемо використовувати внутрішню команду для решти цієї глави.

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

Також можна порівняти два файли:

[[ file1 -nt|-ot|-ef file2 ]]
Опція Функціональність
-nt Перевіряє, чи перший файл є новішим за другий
-ot Перевіряє, чи перший файл старший за другий
-ef Перевіряє, чи є перший файл фізичним посиланням на другий

Тестування змінних

Можна перевірити змінні:

[[ -z|-n $variable ]]
Опція Функціональність
-z Перевіряє, чи порожня змінна
-n Перевіряє, чи змінна не порожня

Тестування рядків

Також можна порівняти два рядки:

[[ string1 =|!=|<|> string2 ]]

Приклад:

[[ "$var" = "Rocky rocks!" ]]
echo $?
0
Опція Функціональність
= Перевіряє, чи перший рядок дорівнює другому
!= Перевіряє, чи перший рядок відрізняється від другого
< Перевіряє, чи перший рядок передує другому в порядку ASCII
> Перевіряє, чи стоїть перший рядок після другого в порядку ASCII

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

Синтаксис для перевірки цілих чисел:

[[ "num1" -eq|-ne|-gt|-lt "num2" ]]

Приклад:

var=1
[[ "$var" -eq "1" ]]
echo $?
0
var=2
[[ "$var" -eq "1" ]]
echo $?
1
Опція Функціональність
-eq Перевіряє, чи дорівнює перше число другому
-ne Перевіряє, чи відрізняється перше число від другого
-gt Перевіряє, чи перше число більше за друге
-lt Перевіряє, чи перше число менше другого

Примітка

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

test "1" = "1"
echo $?
0
test "1" -eq "1"
echo $?
0

Але результат тесту матиме інше значення:

  • У першому випадку це означатиме, що два символи мають однакове значення в таблиці ASCII.
  • У другому випадку це означатиме, що два числа рівні.

Комбіновані тести

Комбінація тестів дозволяє виконати кілька тестів в одній команді. Можна перевірити один і той самий аргумент (файл, рядок або число) кілька разів або різні аргументи.

[ option1 argument1 [-a|-o] option2 argument 2 ]
ls -lad /etc
drwxr-xr-x 142 root root 12288 sept. 20 09:25 /etc
[ -d /etc -a -x /etc ]
echo $?
0
Опція Функціональність
-a AND: Тест буде істинним, якщо всі шаблони істинні.
-o OR: Тест буде істинним, якщо принаймні один шаблон є істинним.

Для внутрішньої команди краще використовувати наступний синтаксис:

[[ -d "/etc" && -x "/etc" ]]

Тести можна згрупувати за допомогою дужок ( ), щоб надати їм пріоритет.

(TEST1 -a TEST2) -a TEST3

Символ ! використовується для виконання зворотної перевірки того, що запитує параметр:

test -e /file # true if file exists
! test -e /file # true if file does not exist

Числові операції

Команда expr виконує операцію з числовими цілими числами.

expr num1 [+] [-] [\*] [/] [%] num2

Приклад:

expr 2 + 2
4

Увага

Будьте обережні, оточуйте знак операції пробілом. Якщо ви забудете, ви отримаєте повідомлення про помилку. У разі множення символу підстановки * передує \, щоб уникнути неправильній інтерпретації.

Опція Функціональність
+ Додавання
- Віднімання
\* Множення
/ Частка ділення
% Залишок від ділення

Команда typeset

Команда typeset -i оголошує змінну як ціле число.

Приклад:

typeset -i var1
var1=1+1
var2=1+1
echo $var1
2
echo $var2
1+1

Команда let

Команда let перевіряє, чи є символ числом.

Приклад:

var1="10"
var2="AA"
let $var1
echo $?
0
let $var2
echo $?
1

Увага

Команда let не повертає послідовний код повернення, коли вона обчислює числове значення 0.

let 0
echo $?
1

Команда let також дозволяє виконувати математичні операції:

let var=5+5
echo $var
10

let можна замінити на $(( )).

echo $((5+2))
7
echo $((5*2))
10
var=$((5*3))
echo $var
15

Author: Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova