如何透過 bash 檢查環境變數是否存在且是否正確來測試環境變數的有效性?

如何透過 bash 檢查環境變數是否存在且是否正確來測試環境變數的有效性?

我正在尋找一個測試,true如果定義了環境變數並且其值不同於0,false或,則該測試將返回NULL

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

注意:在任何情況下,bash 都不應該抱怨變數未定義或具有奇怪的值,除了 0、空、假或未定義之外的任何值都將被視為 true。

答案1

這樣的測試並不像 Java 或 C# 等高階語言中那樣存在,但建置起來相對容易。

針對您提出的問題提出三點評論:

1:您不能在 bash 中使用文字「true」/「false」值;所有命令和條件結構都會產生一個退出狀態, 或者邏輯結果,它要麼是 0(真),要麼是非 0(假)。
以此為基礎,不要嘗試重新發明輪子。

2:盡量不要使用大寫的參數名,除非是環境變數;這是一個簡單的約定,有助於保持程式碼整潔。

3:「NULL」到底是什麼意思?文字字串無效的、空值還是其他什麼?
後兩個概念在 bash 中不存在; A無效的變數將被取消設置,您已經在檢查該變數。

最有效的解決方案是一個函數,它接受變數(或參數,bash 稱之為參數),並檢查這些條件,然後根據該條件設定退出狀態,從而有效地將多個真值壓縮為文字0 或1 。

例如:

is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }

  • is_true "1"產生 0,這是正確的
  • is_true "false"產生 1,這是錯誤的
  • a=10; is_true "$a"產量 0
  • grep -q something somefilesomething如果在 中至少出現一次,則產生 0 somefile

請注意,後一個範例清楚地表明您不需要這樣的構造; bash 中發生的一切已經使用這些基本的 0/1 真值。

但我同意你可能必須轉換來自一些粗糙的外部程式的輸入:)

答案2

我發現這些比較沒有用,因為它們使程式碼的外觀變得模糊且不明顯。我只是使用 bash 的一個很好的功能,它是從 v4.2 開始的,來自線上幫助頁:

   -v varname
          True if the shell variable varname is set (has been assigned a value).

使用方法非常簡單

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
fi

換句話說,要標記為啟用,只需定義即可。嘗試一下!

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"

答案3

您可以使用正規表示式匹配執行所有三個檢查(未定義的參數解析為空字串):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)

相關內容