![[[ -v var ]] 在 Bash 脚本中的行为与在 CLI 中的行为不同](https://linux22.com/image/1672553/%5B%5B%20-v%20var%20%5D%5D%20%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8E%E5%9C%A8%20CLI%20%E4%B8%AD%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%B8%8D%E5%90%8C.png)
我想要一个 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"
这与您的代码逻辑相反。