我想要一个 bash 脚本,如果几个环境变量(用户 ID、密码、令牌)不存在,它会将其设置为一些默认值。存在性测试在 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
是在交互式 shell 中设置的(但它不在环境中)。然后[[ -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"
这与您的代码逻辑相反。