Мне нужен скрипт 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"
Это противоречит логике вашего кода.