Bash linux if null

Bash linux if null

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

  • Оператор if/then проверяет — является ли код завершения списка команд 0 (поскольку 0 означает «успех» ), и если это так, то выполняет одну, или более, команд, следующие за словом then.
  • Существует специальная команда — [ ( левая квадратная скобка). Она является синонимом команды test, и является встроенной командой (т.е. более эффективной, в смысле производительности). Эта команда воспринимает свои аргументы как выражение сравнения или как файловую проверку и возвращает код завершения в соответствии с результатами проверки (0 — истина, 1 — ложь).
  • Начиная с версии 2.02, Bash предоставляет в распоряжение программиста конструкцию [[ . ]] расширенный вариант команды test , которая выполняет сравнение способом более знакомым программистам, пишущим на других языках программирования. Обратите внимание: [[ — это зарезервированное слово, а не команда. Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата. Круглые скобки (( . )) и предложение let . так же возвращают код 0 , если результатом арифметического выражения является ненулевое значение. Таким образом, арифметические выражения могут учавствовать в операциях сравнения.
if cmp a b &> /dev/null # Подавление вывода. then echo "Файлы a и b идентичны." else echo "Файлы a и b имеют различия." fi if grep -q Bash file then echo "Файл содержит, как минимум, одно слово Bash." fi if COMMAND_WHOSE_EXIT_STATUS_IS_0_UNLESS_ERROR_OCCURRED then echo "Команда выполнена успешно." else echo "Обнаружена ошибка при выполнении команды." fi
if echo "Следующий *if* находится внутри первого *if*." if [[ $comparison = "integer" ]] then (( a < b )) else [[ $a < $b ]] fi then echo '$a меньше $b' fi

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

#!/bin/bash echo echo "Проверяется \"0\"" if [ 0 ] # ноль then echo "0 -- это истина." else echo "0 -- это ложь." fi # 0 -- это истина. echo echo "Проверяется \"1\"" if [ 1 ] # единица then echo "1 -- это истина." else echo "1 -- это ложь." fi # 1 -- это истина. echo echo "Testing \"-1\"" if [ -1 ] # минус один then echo "-1 -- это истина." else echo "-1 -- это ложь." fi # -1 -- это истина. echo echo "Проверяется \"NULL\"" if [ ] # NULL (пустое условие) then echo "NULL -- это истина." else echo "NULL -- это ложь." fi # NULL -- это ложь. echo echo "Проверяется \"xyz\"" if [ xyz ] # строка then echo "Случайная строка -- это истина." else echo "Случайная строка -- это ложь." fi # Случайная строка -- это истина. echo echo "Проверяется \"\$xyz\"" if [ $xyz ] # Проверка, если $xyz это null, но. # только для неинициализированных переменных. then echo "Неинициализированная переменная -- это истина." else echo "Неинициализированная переменная -- это ложь." fi # Неинициализированная переменная -- это ложь. echo echo "Проверяется \"-n \$xyz\"" if [ -n "$xyz" ] # Более корректный вариант. then echo "Неинициализированная переменная -- это истина." else echo "Неинициализированная переменная -- это ложь." fi # Неинициализированная переменная -- это ложь. echo xyz= # Инициализирована пустым значением. echo "Проверяется \"-n \$xyz\"" if [ -n "$xyz" ] then echo "Пустая переменная -- это истина." else echo "Пустая переменная -- это ложь." fi # Пустая переменная -- это ложь. echo # Кргда "ложь" истинна? echo "Проверяется \"false\"" if [ "false" ] # это обычная строка "false". then echo "\"false\" -- это истина." #+ и она истинна. else echo "\"false\" -- это ложь." fi # "false" -- это истина. echo echo "Проверяется \"\$false\"" # Опять неинициализированная переменная. if [ "$false" ] then echo "\"\$false\" -- это истина." else echo "\"\$false\" -- это ложь." fi # "$false" -- это ложь. # Теперь мв получили ожидаемый результат. echo exit 0
if [ condition-true ] then command 1 command 2 . else # Необязательная ветка (можно опустить, если в ней нет необходимости). # Дополнительный блок кода, # исполняемый в случае, когда результат проверки -- "ложь". command 3 command 4 . fi

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

if [ condition1 ] then command1 command2 command3 elif [ condition2 ] # То же самое, что и else if then command4 command5 else default-command fi

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

Читайте также:  Launch minecraft on linux

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

bash$ type test test is a shell builtin bash$ type '[' [ is a shell builtin bash$ type '[[' [[ is a shell keyword bash$ type ']]' ]] is a shell keyword bash$ type ']' bash: type: ]: not found 

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

#!/bin/bash echo if test -z "$1" then echo "Аргументы командной строки отсутствуют." else echo "Первый аргумент командной строки: $1." fi echo if /usr/bin/test -z "$1" # Дает тот же рузультат, что и встроенная команда "test". then echo "Аргументы командной строки отсутствуют." else echo "Первый аргумент командной строки: $1." fi echo if [ -z "$1" ] # Функционально идентично вышеприведенному блоку кода. # if [ -z "$1" эта конструкция должна работать, но. #+ Bash выдает сообщение об отсутствующей закрывающей скобке. then echo "Аргументы командной строки отсутствуют." else echo "Первый аргумент командной строки: $1." fi echo if /usr/bin/[ -z "$1" # Функционально идентично вышеприведенному блоку кода. # if /usr/bin/[ -z "$1" ] # Работает, но выдает сообщение об ошибке. then echo "Аргументы командной строки отсутствуют." else echo "Первый аргумент командной строки: $1." fi echo exit 0

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

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

file=/etc/passwd if [[ -e $file ]] then echo "Файл паролей найден." fi

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

Читайте также:  Qt кросскомпиляция linux windows

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

dir=/home/bozo if cd "$dir" 2>/dev/null; then # "2>/dev/null" подавление вывода сообщений об ошибках. echo "Переход в каталог $dir выполнен." else echo "Невозможно перейти в каталог $dir." fi

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

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

var1=20 var2=22 [ "$var1" -ne "$var2" ] && echo "$var1 не равно $var2" home=/home/bozo [ -d "$home" ] || echo "каталог $home не найден."

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

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

#!/bin/bash # Проверка арифметических выражений. # Инструкция (( . )) вычисляет арифметические выражения. # Код возврата противоположен коду возврата инструкции [ . ] ! (( 0 )) echo "Код возврата \"(( 0 ))\": $?." # 1 (( 1 )) echo "Код возврата \"(( 1 ))\": $?." # 0 (( 5 > 4 )) # true echo "Код возврата \"(( 5 > 4 ))\": $?." # 0 (( 5 > 9 )) # false echo "Код возврата \"(( 5 > 9 ))\": $?." # 1 (( 5 - 5 )) # 0 echo "Код возврата \"(( 5 - 5 ))\": $?." # 1 (( 5 / 4 )) # Деление, все в порядке echo "Код возврата \"(( 5 / 4 ))\": $?." # 0 (( 1 / 2 )) # Результат деления < 1. echo "Код возврата \"(( 1 / 2 ))\": $?." # Округляется до 0. # 1 (( 1 / 0 )) 2>/dev/null # Деление на 0. echo "Код возврата \"(( 1 / 0 ))\": $?." # 1 # Для чего нужна инструкция "2>/dev/null" ? # Что произойдет, если ее убрать? # Попробуйте убрать ее и выполнить сценарий. exit 0

Источник

Bash If statement null

Looking for the correct syntax that looks at a bash variable and determines if its null, if it is then do . otherwise continue on. Perhaps something like if [ $lastUpdated = null?; then. else.

3 Answers 3

Just test if the variable is empty:

if [ -z "$lastUpdated" ]; then # not set fi 

There is a difference between a null-valued variable (assigned the empty string) and an unset variable; this answer does not make detect that distinction.

Prior to any assignment, a variable is unset. FOO= (no value give) is equivalent to , which sets the value of FOO to the empty string. The various parameter expansions ( $ vs $ , as an example) allow you to make this distinction. A quoted expansion of an unset variable, such as you use, expands to the empty string, so -z can not distinguish the two states.

@trojanfoe Just FYI. While the distinction exists, it's not as common that one cares about the distinction 🙂

Expanding on @chepner's comments, here's how you could test for an unset (as opposed to set to a possibly empty value) variable:

The $ syntax gives an empty string if $variable is unset, and the string "word" if it's set:

$ fullvar=somestring $ emptyvar= $ echo ">" $ echo ">" $ echo ">" <> 

@panepeter True, but my experience is that it's easier and safer to just double-quote variable references than it is to figure out when it's safe to leave them off. In this case, the fact that it requires a detailed explanation (including understanding what [ -z ] does and why) mans it's much easier to use double-quotes. To put it another way: if someone thinks [ -z $ ] is a good way to test for a set variable, they're likely to infer that [ -n $ ] is a good way to test for an unset variable, but it will completely fail.

Читайте также:  Astra linux libc6 dev

To sum it all up: There is no real null value in bash. Chepner's comment is on point:

The bash documentation uses null as a synonym for the empty string.

Therefore, checking for null would mean checking for an empty string:

if [ "$" = "" ]; then # $lastUpdated is an empty string fi 

If what you really want to do is check for an unset or empty (i.e. "", i.e. 'null') variable, use trojanfoe's approach:

if [ -z "$lastUpdated" ]; then # $lastUpdated could be "" or not set at all fi 

If you want to check weather the variable is unset, but are fine with empty strings, Gordon Davisson's answer is the way to go:

if [ -z $ ]; then # $lastUpdated is not set fi 

Источник

Shell script - exiting script if variable is null or empty

I am expecting to use the below variable in my bash script but in case if this is empty or null what would be the best way to handle it and exit from script.

I am seeing answers with 'set -u'. I know this will work but is this good for production environment?

yes, variable consisting of whitespaces, considered empty. basically, I am thinking to put a check like if [[ ! -z "$" && "$" != ’’ ]] for this.

7 Answers 7

There is a built-in operator for requiring that a variable is set. This will cause the script to exit if it isn't.

Commonly this is used with the : no-op near the beginning of the script.

The conflation of "unset or empty" is somewhat different. There is no similar construct for exiting on an empty but set value, but you can easily use the related syntax $ which expands to $var if it is set and nonempty, and default otherwise. There is also $ which only produces default if the variable is properly unset.

This can be particularly useful when you want to use set -u but need to cope with a possibly unset variable:

case $ in '') echo "$0: Need a value in var" >&2; exit 1;; esac 

I somewhat prefer case over if [ "$" = '' ] , mainly because it saves me from having to wrap double quotes around $ , and the pesky case of a value in $var which gets interpreted as an option to [ and gives you an error message when you least expect it. (In Bash, [[ doesn't have these problems; but I prefer to stick to POSIX shell when I can.)

Источник

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