[[ -v var ]] 在 Bash 脚本中的行为与在 CLI 中的行为不同

[[ -v var ]] 在 Bash 脚本中的行为与在 CLI 中的行为不同

我想要一个 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"

这与您的代码逻辑相反。

相关内容