День сегодня какой-то сумасшедший, троить жестко начинаю, но раз обещал еще один пост, значит нужно сделать.

Как проверить, определена ли переменная в bash скрипте? Давай разберемся.

К примеру мне нужно установить переменную CRAZYDAY и выполнить определенные действия в моём скрипте. Если переменная CRAZYDAY задана, то срабатывает первая логика, если нет, то другая.

Чтобы узнать определена ли переменная я могу передать параметр -z условному выражению if.

if [ -z ${CRAZYDAY+x} ];
then
    echo "LOGIC 1"
else
    echo "LOGIC 2"
fi

либо с помощью команды test

if test -z ${CRAZYDAY+y}
then
    echo "LOGIC 1"
else
    echo "LOGIC 2"
fi

Команда test применяется для проверки условия. Она вычисляет выражение и, если его значение - истина, возвращает код завершения 0; иначе - ненулевое значение. Ненулевой код возвращается и в случае, когда выражение отсутствует. При проверке прав доступа используется действующий идентификатор пользователя.

Когда я запущу эти скрипты, не установив переменную CRAZYDAY, я получу результат LOGIC 1. Для того чтобы получить LOGIC 2, я должен сделать:

export CRAZYDAY=somestr
./script.sh

Результатом будет LOGIC 2. Чтобы снова получить LOGIC 1, мне нужно сбросить установленную переменную с помощью команды: unset CRAZYDAY.

Теперь давай разберем как работает: ${CRAZYDAY+x}

Выполняем последовательно команды и смотрим на выхлоп дебага:

set -x
./script.sh

вернуло:

+ '[' -z ']'
+ echo LOGIC 1
LOGIC 1

далее:

CRAZYDAY=some ./script.sh

появился параметр x, с ним и идет сравнение, x=some

+ '[' -z x ']'
+ echo LOGIC 2
LOGIC 2

далее:

export CRAZYDAY=str
./script.sh

вернуло то же самое

+ '[' -z x ']'
+ echo LOGIC 2
LOGIC 2

ну а теперь так:

unset CRAZYDAY
./script.sh

вернуло то же самое как и в первом примере

+ '[' -z ']'
+ echo LOGIC 1
LOGIC 1
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
По сути x это расширение параметра bash, если переменная CRAZYDAY не задана, она не имеет в себе никакого значения. Ну а если задано, то все что внутри переменной CRAZYDAY заменяется просто на x и потом уже сравнивается в if.

Вместо x можно написать хоть что, будет работать. Но в бест практиках рекомендуют использовать именно x ну или y.

Есть и другие способы узнать задана ли переменная, но они более гиковские и совсем не человечные, поэтому опущу этот момент чтобы тебя не шокировать.

set -x = включить режим дебага set +x = выключить режим дебага

Добавить пока больше нечего, изучай. Завтра снова увидимся, очередной CRAZYDAY. Ну и доброй ночи тебе!