[[ -v var ]] ведет себя по-разному внутри скрипта bash и CLI

[[ -v var ]] ведет себя по-разному внутри скрипта bash и CLI

Мне нужен скрипт bash, который установит несколько переменных окружения (userid, password, token) на некоторые значения по умолчанию, если они еще не существуют. Тест на существование работает в CLI, но не в скрипте.

magilla@raspberrypi:~ $ ps -p $$
    PID TTY          TIME CMD
   3005 pts/0    00:00:05 bash
magilla@raspberrypi:~ $ echo "${BASH_VERSION}"
5.1.4(1)-release

magilla@raspberrypi:~ $ env | grep var
magilla@raspberrypi:~ $ [[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
${var} not defined

magilla@raspberrypi:~ $ cat myscript
#!/bin/bash
[[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
magilla@raspberrypi:~ $ bash myscript
${var} is defined
magilla@raspberrypi:~ $ bash < myscript
${var} is defined

решение1

Видимо, varустанавливается в вашей интерактивной оболочке (хотя в среде его нет). Затем [[ -v var ]]возвращает успех и echo "\${var} not defined"выполняется.

Видите ли not defined, логика вашего кода неверна.

В скрипте varне задано, [[ -v var ]]возвращает ошибку и echo "\${var} is defined"выполняется.

Видите ли is defined, потому что логика снова неверна. Следующая логика имеет смысл:

[[ -v var ]] && echo "\${var} is defined" || echo "\${var} not defined"

Это противоречит логике вашего кода.

Связанный контент