Linux script if test

Проверка условий в bash

Часто при написании скриптов под bash необходимо проверять результаты выполнения тех или иных команд.

Это немного подправленная выдержка из этой статьи .

Скобки

[ — является специальной встроенной командой test воспринимающей свои аргументы как выражение сравнения или файловую проверку […..].

[[ — расширенный вариант от «[«, является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата. Внутри «[[….]]» разрешается выполнение операторов &&, || которые приводят к ошибке в обычных скобках «[….]» тем самым вариант с двойной скобкой более универсален.

(( — является арифметическими выражениями, которое так же возвращают код 0. Тем самым такие выражения могут участвовать в операциях сравнения.

Приведу список логических операторов, которые используются для if|then|else:

-z – строка пуста

-n – строка не пуста

=, ( == ) – строки равны

!= – строки неравны

-ne – неравно

-gt,(>) – больше

-ge,(>=) — больше или равно

! — отрицание логического выражения

-a,(&&) – логическое «И»

-o,(||) -логическое «ИЛИ»

Конструкции простой проверки if|then

if [[ condition ]]; then commands fi

Другими словами:

если проверяемое_выражение_или_команды_верны; то выполняем команды закрываем если

#!/bin/bash if echo Тест; then echo 0 fi

Часто встречается в скриптах проверка — «существует ли файлы или каталоги» на их примере покажу работу

#!/bin/bash if [ -f $HOME/.bashrc ]; then echo "Файл существует!" fi

$HOME/.bashrc – путь до файла
echo – печатает сообщение в консоль

#!/bin/bash if [[ -f $HOME/.bashrc && -f /usr/bin/nano ]]; then echo "Все впорядке, можно редактировать!" fi

&& — логическое «и», если первый путь «истина» проверяем второй, если он тоже «истина», то выполняем команды (echo)
-f – ключ проверки на существования файла (о них чуть ниже)

Конструкции простой проверки if|then|else

if [[ condition ]]; then commands 1 else commands 2 fi

если проверяемое_выражение_или_команды_верны; то команды 1 иначе команды 2 закрываем если

Возможно не лучший пример, нас интересует именно ответ 0 или 1. В результате печатается в консоль «Тест» и «0» потому что команда «echo Тест» успешна и это «истина».

#!/bin/bash if echo Тест; then echo 0 else echo 1 fi

Намерено допустите ошибку изменив echo, в результате получите «1» и сообщение о том что «команда echo не существует» и это «ложь».

#!/bin/bash if echo Тест; then echo 0 else echo 1 fi

Примеры «существуют ли файл?»

Читайте также:  Просмотр занятого места диске linux

Если файл bashrc существует, то печатает в консоль «Файл существует!», иначе печатает «Файл не существует!»

#!/bin/bash if [ -f "$HOME/.bashrc" ]; then echo "Файл существует!" else echo "Файл не существует!" fi

Поиграйте с именем проверяемого файла

#!/bin/bash if [[ -f "$HOME/.bashrc" && -f "/usr/bin/nano" ]]; then echo "Все в порядке, можно редактировать!" else echo "Ошибка!" fi

Ключи к файлам и каталогам

[ -ключ “путь” ]
[ -e “путь каталогу_или_файлу”] – существует ли файл или каталог.

[ -r “путь к файлу/каталогу”] – доступен ли файл/каталог для чтения.

[ -f “путь к файлу/каталогу”] – существует ли файл.

[ -d “путь к каталогу”] – существует ли каталог.
Полное описание возможных применений различных скобок, правильное расставление кавычек уходит далеко от темы, поэтому могу посоветовать обратится к руководству Advanced Bash Scripting

Арифметика

Если оператор > использовать внутри [[….]], он рассматривается как оператор сравнения строк, а не чисел. Поэтому операторам > и < для сравнения чисел лучше заключить в круглые скобки.

Используем круглые скобки для математического сравнение. Если «3» меньше «6» печатаем «Да».

#!/bin/bash if (( 3  6));then echo Да fi

Использование команды test, коей являются квадратные скобки. Если «3» меньше «6» печатаем «Да».

#!/bin/bash if [ 3 -lt 6 ]; then echo Да fi

Можно использовать и двойные квадратные скобки, это расширенный вариант команды test, эквивалентом которой является «[ ]». Если «3» меньше «6» печатаем «Да».

#!/bin/bash if [[ 3 -lt 6 ]]; then echo Да fi

Используем двойные квадратные скобки, потому что применяем оператор «&&». Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если оно тоже 2=2 (истина), печатаем «Верно»

#!/bin/bash a="2" b="2" if [[ 2 = "$a" && 2 = "$b" ]] ; then echo Верно else echo Не верно fi

Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если переменная «b» не равна двум (ложь), печатаем «Не верно»

#!/bin/bash a="2" b="3" if [[ 2 = "$a" && 2 = "$b" ]] ; then echo Верно else echo Не верно fi

Можно конечно сделать проще, нам главное понять принцип if|then и else, не стесняйтесь менять, подставляя свои значения.

Вложение нескольких проверок

Bash позволяет вкладывать в блок несколько блоков

#!/bin/bash if [[ condition 1 ]]; then if [[ condition 2 ]]; then command 1 else command 2 fi else command 3 fi

Построения многоярусных конструкций

Для построения многоярусных конструкции, когда необходимо выполнять множество проверок лучше использовать elif — это краткая форма записи конструкции else if.

if [[ condition 1 ]]; then command 1 command 2 elif [[ condition 2 ]]; then command 3 command 4 else command 5 fi

Источник

Using test Command in Bash Scripts

Learn to use the test command in bash for testing conditions and making comparisons.

The bash test command is used to check the validity of an expression. It checks whether a command or an expression is true or false. Also, it can be used to check the type and permissions of a file.

If the command or expression is valid, the test command returns a 0 else it returns 1 .

Using the test command

The test command has a basic syntax like this:

When using variables in the test command, use double quotes with the variable’s name.

Let’s use the test command to check whether 10 equals 20 and 10 equals 10:

$ test 10 -eq 20 && echo "true" || echo "false"
  • test — test command
  • 10 — the first variable
  • -eq — operator for comparison
  • 20 — second variable

If the given expression is valid, the first command is executed, or else the second command is executed.

💡Instead of using the test command keyword, you can also use the brackets [] . But remember, there is space between the [ mark and the variables to compare:

[ 10 -eq 20 ] && echo "true" || echo "false"

test command examples

Not only integers; you can also compare strings in bash with the test command. Let me share some examples.

String comparison with test Command

Here are some string comparison examples using the test command.

Check if the string is not empty

The -n flag checks if the string length is non-zero. It returns true if the string is non-empty, else it returns false if the string is empty:

$ [ -n "sam" ] && echo "True" || echo "False"

Check that string is not empty in bash

Check if the string is empty

The -z flag checks whether the string length is zero. If the string length is zero, it returns true, else it returns false:

$ [ -z "sam" ] && echo "True" || echo "False"

Check if strings are equals

The ‘=’ operator checks if string1 equals string2. If the two strings are equal, then it returns 0; if the two strings are not equal, then it returns 1:

In this case, the expression is slightly different, instead of typing true or false, the stdout variable is printed using $? .

Check if strings are not equals

The != operator checks if String1 is not equal to String2. If the two strings are not equal, then it returns 0. If two strings are equal, then it returns 1:

Integer comparison with test command

Let’s make some number comparisons with bash test.

Check if numbers are equal

The -eq operator checks if Integer1 equals Integer2. If integer1 equals integer2, then it returns 0, else it returns 1:

Check if the numbers are not equal

Case 2. The -ne operator checks if integer1 is not equal to integer2. If Integer1 is not equal to integer2, then it returns 0, else it returns 1:

Check if a number is equal or greater than the other

The -ge operator checks that integer1 is greater than or equal to integer2. If integer 1 is greater than or equal to integer 2 it returns 0; if not, then it returns 1.

The -gt operator checks if integer1 is greater than integer2. If yes, then it returns 0. Otherwise, it returns 1:

Check if a number is equal or less than the other

The -le operator checks if the integer1 is less than or equal to integer2. If true it returns 0, else it returns 1:

The -lt operator checks if integer1 is less than integer2. If integer 1 is less than integer2, then it returns 0, else it returns 1:

Integer comaprison in bash using the test command

File and directory Operations with test

The test command can be used with files and directories.

This checks whether a file is executable (by the current user) or not. If a file is executable, then it returns 0, else it returns 1:

[ test -x filename ] && echo executable || echo non-executable

You can use other file permissions like r and w in the same fashion. Other common parameters you can use are:

| Command | Description | |---------|--------------------------| | -e | File/directory exists | | -f | is a file | | -d | is a directory | | -s | File size greater than 0 | | -L | is a link | | -S | is a socket |

Using test command in bash scripts

You have seen the one-liners of the test command so far. You can also use the test condition with the if-else condition in the bash scripts.

Let me share a simple example of comparing two numbers passed as arguments to the shell script:

#!/bin/bash ## Check if the numbers are equal or not read -p "Enter the first number: " num1 read -p "Enter the second number: " num2 if test "$num1" -eq "$num2" then echo "$num1 is equal to $num2" else echo "$num1 is not equal to $num2" fi

You can run the bash script with various numbers:

Using test in bash scripts

I hope this tutorial helps you to understand the basics of the test command in the bash.

Источник

Оцените статью
Adblock
detector