Linux bash test and

Глава 7. Проверка условий

практически любой язык программирования включает в себя условные операторы, предназначенные для проверки условий, чтобы выбрать тот или иной путь развития событий в зависимости от этих условий. В Bash, для проверки условий, имеется команда test, различного вида скобочные операторы и условный оператор if/then.

7.1. Конструкции проверки условий

Оператор if/then проверяет — является ли код завершения списка команд 0 (поскольку 0 означает «успех» ), и если это так, то выполняет одну, или более, команд, следующие за словом then.

Существует специальная команда — [ (левая квадратная скобка). Она является синонимом команды test, и является встроенной командой (т.е. более эффективной, в смысле производительности). Эта команда воспринимает свои аргументы как выражение сравнения или как файловую проверку и возвращает код завершения в соответствии с результатами проверки (0 — истина, 1 — ложь).

Начиная с версии 2.02, Bash предоставляет в распоряжение программиста конструкцию [[ . ]] расширенный вариант команды test , которая выполняет сравнение способом более знакомым программистам, пишущим на других языках программирования. Обратите внимание: [[ — это зарезервированное слово, а не команда.

Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата.

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

Условный оператор if проверяет код завершения любой команды, а не только результат выражения, заключенного в квадратные скобки.

Оператор if/then допускает наличие вложенных проверок.

Это детальное описание конструкции «if-test» любезно предоставлено Stephane Chazelas.

Пример 7-1. Что есть «истина»?

Упражнение. Объясните результаты, полученные в Пример 7-1.

Когда if и then располагаются в одной строке, то конструкция if должна завершаться точкой с запятой. И if , и then — это зарезервированные слова. Зарезервированные слова начинают инструкцию, которая должна быть завершена прежде, чем в той же строке появится новая инструкция.

Else if и elif

elif — это краткая форма записи конструкции else if . Применяется для построения многоярусных инструкций if/then .

Конструкция if test condition-true является точным эквивалентом конструкции if [ condition-true ], где левая квадратная скобка [ выполняет те же действия, что и команда test. Закрывающая правая квадратная скобка ] не является абсолютно необходимой, однако, более новые версии Bash требуют ее наличие.

Команда test — это встроенная команда Bash, которая выполняет проверки файлов и производит сравнение строк. Таким образом, в Bash-скриптах, команда test не вызывает внешнюю ( /usr/bin/test) утилиту, которая является частью пакета sh-utils . Аналогично, [ не производит вызов утилиты /usr/bin/[, которая является символической ссылкой на /usr/bin/test.

Пример 7-2. Эквиваленты команды test — /usr/bin/test, [ ] , и /usr/bin/[

Конструкция [[ ]] более универсальна, по сравнению с [ ] . Этот расширенный вариант команды test перекочевал в Bash из ksh88 .

Внутри этой конструкции не производится никакой дополнительной интерпретации имен файлов и не производится разбиение аргументов на отдельные слова, но допускается подстановка параметров и команд.

Конструкция [[ . ]] более предпочтительна, нежели [ . ], поскольку поможет избежать некоторых логических ошибок. Например, операторы && , || , и > внутри [[ ]] вполне допустимы, в то время как внутри [ ] порождают сообщения об ошибках.

Строго говоря, после оператора if, ни команда test, ни квадратные скобки ( [ ] или [[ ]] ) не являются обязательными.

Инструкция «if COMMAND» возвращает код возврата команды COMMAND.

Точно так же, условие, находящееся внутри квадратных скобок может быть проверено без использования оператора if.

Внутри (( )) производится вычисление арифметического выражения. Если результатом вычислений является ноль, то возвращается 1 , или «ложь» . Ненулевой результат дает код возврата 0 , или «истина» . То есть полная противоположность инструкциям test и [ ] , обсуждавшимся выше.

Пример 7-3. Арифметические выражения внутри (( ))

Источник

Изучаем Bash: Команда test и ее аналоги. Проверка файлов и сравнение строк

После небольшой паузы, я продолжаю писать статьи на тему Bash и сегодня мы поговорим о команде test и ее аналогах. Разбирать одну теорию мы не будем и давайте сразу взглянем на скрипт и разберемся на его примере.

file=/etc/fstab # Объявляем переменную

if test -e $file # Используем команду test

echo «Файл fstab найден.»

echo «Что-то нету такого файла»

Как мы видим, мы использовали знакомые нам операторы if / then , которые я уже описывал ранее.

После оператора if стоит команда test которая и и производит проверку нашего файла, который мы объявили в переменной. Также, команду test мы использовали с опцией «-e», данная опция возвращает значение «true», если файл найден.

В случае «true» запускается оператор then и выводит строку echo, если же файл не найдет, что означает «false», то запускается оператор else и выводит сообщение «Что-то нету такого файла».

Теперь давайте рассмотрим аналоги команды test. Тот же скрипт, только вместо test используем другие команды:

file=/etc/fstab # Объявляем перменную

if /usr/bin/[ -e $file ] # Используем команду «[«, также мы закрыли ее правой ], потому bash требует ее наличие

echo «Файл fstab найден.»

echo «Что-то нету такого файла»

Использовали вместо команды test, команду «[» с закрытой правой «]». Вообще, старые версии bash не требовали наличие правой закрывающейся ]. Теперь это необходимо, чтобы избежать ошибок.

Я рекомендую вместо [ ] использовать конструкцию [[ ]]:

file=/etc/fstab # Объявляем перменную

if [[ -e $file ]] # Используем конструкцию [[ ]]

echo «Файл fstab найден.»

echo «Что-то нету такого файла»

Почему [[ ]] лучше, чем [ ]? Потому что внутри [[ ]] вы можете использовать например такие операторы, как: &&, ||, , в то время как внутри [ ] будут сообщения об ошибках.

Кстати, вы можете использовать [ ] и [[ ]] без if / then / else. Те команды как бы заменяют данные операторы:

[[ «$var1» -ne «$var2» ]] && echo «$var1 не равно $var2»

Давайте разберем, что мы тут написали.

Итак, мы объявили две переменные var1 и var2 с числовыми значениями. Далее, мы вместо if / then / else использовали [[ ]], «-ne», которая находится между «$var1» и «$var2» означает «не ровно». Оператор && — and (и).

Вот так вот 🙂 Любые вопросы приветствуются! 🙂 С следующих статьях мы рассмотрим операции сравнения чисел и строк.

у меня вопрос, а арифметические операции делать можно в [[ ]]?

нет, для этого существует оператор (( )), о котором я напишу обязательно 🙂

спасибо! :=) мне это нужно :=)

Так. Вы хотите сказать что, пример, конвеер cat file | grep 123 лучше всего помещать в [[ ]] ?

Эксперт — зто человек, который совершил все возможные ошибки в очень узкой специальности.

это у тебя кусок кода или это весь скрипт? В этом случае не надо, потому что у тебя тут нету ни какого сравнения, не тестирования. обычный вывод информации и поиск grep. Мое мнение 🙂

Конечно это вырезка из скрипта, придуманная на ходу, но у меня реально есть скрипты с похожими условиями. Условия такие:
[ cat file | grep 123 ] ; then
rm file
fi
продолжение скрипта допустим break

Эксперт — зто человек, который совершил все возможные ошибки в очень узкой специальности.

в твоем случае ты можешь вместо [ ], использовать оператор if, то есть:

if cat file | grep 123; then
rm file
fi

действие будет аналогичным 🙂

Едрен батом, прошу прощения. Я не верно написал
[ `cat file | grep 123` = 123 ]
Но ваш способ кажется еще лучше, попробую.

Эксперт — зто человек, который совершил все возможные ошибки в очень узкой специальности.

что значит grep 123 = 123 и зачем тут используешь одинарные ковычки?

P.S. Александр, я настолько простой, что лучше ко мне на «ты» 😉

Все просто. любую команду имеющую параметры через пробел нужно помещать в « иначе shell не понимает. А вообще смысл у моего примера такой: если в текстовом файле появится строчка имеющая 123, это для примера, на самом деле в реальном скрипте ищется #####, так вот если это в файле есть, то файл не обрабатывать, а удалить и перейти к следующему циклу. Возможно я забыл еще что-то но смысл такой и он у меня работает. Есть правда у меня косяк: если попадется 2 строчки с тем что я ищю, то скрипт пишет: test argument expected и завершается полность, пока это еще не побарол, не могу понять почему ему 2 значения в поиске не устраивает, благо такое случается раз в пол года.

А я понял. Можно либо в ` ` либо в [[ ]] вот и весь ответ. Блин как обычно не дочитал совсем немного. Спасибо, но я привык «.

Эксперт — зто человек, который совершил все возможные ошибки в очень узкой специальности.

я имел ввиду, почему два раза у тебя 123 в скрипте? 🙂

Как понять зачем, если условие равно то, если нет то, не пойму в чем собственно вопрос.

Эксперт — зто человек, который совершил все возможные ошибки в очень узкой специальности.

отличная работа, Максим, я тоже присоединюсь к написанию статей по bash, хорошая тема

Источник

Bash test builtin command

On Unix-like operating systems, test is a builtin command of the Bash shell that tests file attributes, and perform string and arithmetic comparisons.

Description

test provides no output, but returns an exit status of 0 for «true» (test successful) and 1 for «false» (test failed).

The test command is frequently used as part of a conditional expression. For instance, the following statement says, «If 4 is greater than 5, output yes, otherwise output no.»

The following statement says, «If 6 is greater than 5, output yes, otherwise output no.»

The test command may also be expressed with single brackets [ . ], as long as they are separated from all other arguments with whitespace. For example, the following statement checks that the system file /etc/passwd exists, and if not, outputs «uh-oh.»

Syntax

Shell options and variables:

Simple logic (test if values are null):

Numerical comparison (for integer values only; bash doesn’t do floating point math):

Options

The test builtin command takes the following options.

-a file Returns true if file exists. Does the same thing as -e. Both are included for compatibility reasons with legacy versions of Unix.
-b file Returns true if file is «block-special.» Block-special files are similar to regular files, but are stored on block devices — special areas on the storage device that are written or read one block (sector) at a time.
-c file Returns true if file is «character-special.» Character-special files are written or read byte-by-byte (one character at a time), immediately, to a special device. For example, /dev/urandom is a character-special file.
-d file Returns true if file is a directory.
-e file Returns true if file exists. Does the same thing as -a. Both are included for compatibility reasons with legacy versions of Unix.
-f file Returns true if file exists, and is a regular file.
-g file Returns true if file has the setgid bit set.
-h file Returns true if file is a symbolic link. Does the same thing as -L. Both are included for compatibility reasons with legacy versions of Unix.
-L file Returns true if file is a symbolic link. Does the same thing as -h. Both are included for compatibility reasons with legacy versions of Unix.
-k file Returns true if file has its sticky bit set.
-p file Returns true if the file is a named pipe, e.g., as created with the command mkfifo.
-r file Returns true if file is readable by the user running test.
-s file Returns true if file exists, and is not empty.
-S file Returns true if file is a socket.
-t fd Returns true if file descriptor fd is opened on a terminal.
-u file Returns true if file has the setuid bit set.
-w file Returns true if the user running test has write permission to file, i.e., make changes to it.
-x file Returns true if file is executable by the user running test.
-O file Returns true if file is owned by the user running test.
-G file Returns true if file is owned by the group of the user running test.
-N file Returns true if file was modified since the last time it was read.
file1 -nt file2 Returns true if file1 is newer (has a newer modification date/time) than file2.
file1 -ot file2 Returns true if file1 is older (has an older modification date/time) than file2.
file1 -ef file2 Returns true if file1 is a hard link to file2.
test [-n] string Returns true if string is not empty. Operates the same with or without -n.

For example, if mystr=»», then test «$mystr» and test -n «$mystr» would both be false. If mystr=»Not empty», then test «$mystr» and test -n «$mystr» would both be true.

-z string Returns true if string string is empty, i.e., «».
string1 = string2 Returns true if string1 and string2 are equal, i.e., contain the same characters.
string1 != string2 Returns true if string1 and string2 are not equal.
string1 string2 Returns true if string1 sorts after string2 lexicographically, according to the ASCII numbering. As noted above, use test «$str1» \> «$str2» instead of test $str1 > $str2. The latter command creates or overwrites a file whose name is the value of variable str2.
-o option Returns true if the shell option opt is enabled.
-v var Returns true if the shell variable var is set.
-R var Returns true if the shell variable var is set, and is a name reference. (It’s possible this refers to an indirect reference, as described in Parameter expansion in bash.)
! expr Returns true if and only if the expression expr is null.
expr1 -a expr2 Returns true if expressions expr1 and expr2 are both not null.
expr1 -o expr2 Returns true if either of the expressions expr1 or expr2 are not null.
arg1 -eq arg2 True if argument arg1 equals arg2.
arg1 -ne arg2 True if argument arg1 is not equal to arg2.
arg1 -lt arg2 True if numeric value arg1 is less than arg2.
arg1 -le arg2 True if numeric value arg1 is less than or equal to arg2.
arg1 -gt arg2 True if numeric value arg1 is greater than arg2.
arg1 -ge arg2 True if numeric value arg1 is greater than or equal to arg2.

Notes

All arguments to test must be separated by a space, including all operators.

The operators are lexicographical comparisons, based on ASCII numbering. They are not numerical operators (instead, use -lt, -gt, etc. for comparing numbers).

The precise behavior of test, depending on the number of arguments provided, is as follows:

# args test behavior
0 Always return false.
1 Return true, if and only if the expression is not null.
2 If the first argument is !, return true if and only if the expression is null.

If the first argument is one of the other unary operators (-a, -b, etc.), return true if and only if the unary test of the second argument is true.

Источник

Читайте также:  Seagate usb driver windows 10
Оцените статью