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



Как проверить, определена ли переменная в 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



По сути x это расширение параметра bash, если переменная CRAZYDAY не задана, она не имеет в себе никакого значения. Ну а если задано, то все что внутри переменной CRAZYDAY заменяется просто на x и потом уже сравнивается в if.



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



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



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

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



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



tags: #bash #linux



🟢 Подпишись: @bashdays