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