![[[ -v var ]] ведет себя по-разному внутри скрипта bash и CLI](https://rvso.com/image/1672553/%5B%5B%20-v%20var%20%5D%5D%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82%20%D1%81%D0%B5%D0%B1%D1%8F%20%D0%BF%D0%BE-%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%BC%D1%83%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20bash%20%D0%B8%20CLI.png)
Мне нужен скрипт 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"
Это противоречит логике вашего кода.