![[[ -v var ]] 在 bash 腳本與 CLI 中的行為不同](https://rvso.com/image/1672553/%5B%5B%20-v%20var%20%5D%5D%20%E5%9C%A8%20bash%20%E8%85%B3%E6%9C%AC%E8%88%87%20CLI%20%E4%B8%AD%E7%9A%84%E8%A1%8C%E7%82%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"
這與你的程式碼邏輯相反。