TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #71 6.41K
День сегодня какой-то сумасшедший, троить жестко начинаю, но раз обещал еще один пост, значит нужно сделать.

Как проверить, определена ли переменная в 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
  • 👍 76
More from @bashdays
  1. Oct 4, 2026Архивирование и хранение. Часть 2/4. Всем привет, с вами снова TagdTagd. Первая часть тут:…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →