0

Сравнение null и пустой строки в Bash

74

Заголовок: Проблема с проверкой переменной в Bash: выводится "Hi", даже если переменная не задана

Текст вопроса:

Я не задаю никаких значений для переменной $pass_tc11, в результате чего при попытке вывести ее значение получается null. Как можно корректно сравнить переменную в условии if?

Вот мой код. Я не хочу, чтобы "Hi" выводился...

-bash-3.00$ echo $pass_tc11

-bash-3.00$ if [ "pass_tc11" != "" ]; then
> echo "hi"
> fi
hi
-bash-3.00$

Как я правильно могу проверить, что переменная не задана или пуста, чтобы избежать ненужного вывода?

2 ответ(ов)

1

Во-первых, обратите внимание, что вы неправильно используете переменную:

if [ "pass_tc11" != "" ]; then
#     ^
#     пропущен $

Тем не менее, чтобы проверить, пуста переменная или нет, вы можете использовать -z — для проверки, что строка пуста:

if [ ! -z "$pass_tc11" ]; then
   echo "hi, I am not empty"
fi

Или используйте -n — для проверки, что длина строки ненулевая:

if [ -n "$pass_tc11" ]; then
   echo "hi, I am not empty"
fi

Согласно man test:

-z STRING

длина STRING равна нулю

-n STRING

длина STRING ненулевая

Примеры:

$ [ ! -z "$var" ] && echo "yes"
$

$ var=""
$ [ ! -z "$var" ] && echo "yes"
$

$ var="a"
$ [ ! -z "$var" ] && echo "yes"
yes

$ var="a"
$ [ -n "$var" ] && echo "yes"
yes
0

В ответ на ваш вопрос, fedorqui предложил рабочее решение, но существует и другой способ выполнить ту же задачу.

Вы можете проверить, установлена ли переменная, с помощью простого условного оператора:

#!/bin/bash
amIEmpty='Hello'
# Это будет истинно, если переменная содержит значение
if [ $amIEmpty ]; then
    echo 'Нет, я не пуст!';
fi

Кроме того, если вам нужно проверить, пуста ли переменная, можно использовать следующий код:

#!/bin/bash      
amIEmpty=''
# Это будет истинно, если переменная пуста
if [ ! $amIEmpty ]; then
    echo 'Да, я пуст!';
fi

Для более подробной информации о конструкции if в bash вы можете обратиться к хорошей документации на tldp.org:

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь