[[ -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"

這與你的程式碼邏輯相反。

相關內容