HOWTO · Bash

如何檢查 Bash 變數是否為空

了解在 Bash 中測試變數是否為空字串的四種方法,包括安全的引用方式,以及未設定的值和僅含空白字元的值的表現。

本頁內容

對於提供的 Bash 值,請引用其展開形式,以便 shell 將它作為一個參數傳遞。此指令碼會列印一個帶標籤的值:

value='Bash'

if [ -z "$value" ]; then
    printf '%s\n' 'No value supplied'
else
    printf 'Value: %s\n' "$value"
fi
Value: Bash

當展開後的字串為零個字元時,test 命令(也寫作 [ ... ])返回成功。在普通的 Bash shell 中,未設定的變數會展開為空字串,因此 -z 會同樣對待未設定的值和明確為空的值。使用 set -u 時,請使用 ${value-} 在測試前提供一個預設值。像 0 這樣的值或由空格組成的字串並不為空;該測試檢查的是字元,而不是一個詞看起來是否為真。

使用 -z 檢查 Bash 變數是否為空

當展開後的字串為零個字元時,test 命令(也寫作 [ ... ])返回成功狀態。非零狀態意味著它至少包含一個字元。測試本身不會列印訊息;if 陳述式會選擇要執行哪個命令。

value=''

if [ -z "$value" ]; then
    printf '%s\n' 'value is empty'
else
    printf '%s\n' 'value is not empty'
fi
value is empty

對於未設定的變數,在通常的 shell 組態下,同樣帶引號的檢查會成功。使用 set -u 時,請改為寫 [ -z "${value-}" ],以便展開保持已定義。括號命令是一個 shell 命令,其成功或失敗由其結束狀態表示;它不會自動列印 true 或 false。

使用 -n 檢查 Bash 變數是否非空

使用 -n 進行互補的測試:當展開後的字串至少包含一個字元時,它返回成功。then 分支會針對非空值執行,而當測試失敗時(包括值為空時)會執行 else。

value='Bash'

if [ -n "$value" ]; then
    printf '%s\n' 'value is not empty'
else
    printf '%s\n' 'value is empty'
fi
value is not empty

引用很重要,因為它能將展開保留為一個參數。與 -z 一樣,如果指令碼可能使用 set -u 執行且變數可能未設定,請在引號內使用 ${value-}。當下一個操作只應在提供值之後才發生時,-n 選項尤其易於閱讀。

將 Bash 變數與空字串進行比較

您可以使用 Bash 的 [[ ... ]] 條件運算式將值直接與空字串進行比較。帶引號的展開使意圖清晰,而包含空格的字串仍然非空,因為這些空格是字元。

value='   '

if [[ "$value" == "" ]]; then
    printf '%s\n' 'value is empty'
else
    printf '%s\n' 'value is not empty'
fi
value is not empty

此範例走第二個分支:空格在 [[ ... ]] 內不會消失。對於使用 set -u 的指令碼,請比較 ${value-},以便將未設定的變數視為空字串處理。

使用 ${parameter:+word} 參數展開檢查變數

當參數已設定且非 null 時,${parameter:+word} 形式會展開為 word。當參數未設定或包含空字串時,它不會展開為任何內容。在引用展開的同時對其進行測試:

value='Bash'

if [ "${value:+present}" ]; then
    printf '%s\n' 'value is set and nonempty'
else
    printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty

當您需要區分的是「已設定且非空」與「未設定或為空」時,這個慣用法很有用。它不會區分後兩種狀態。要區分未設定的參數與已設定但為空的參數,請將 Bash 的 [[ -v value ]] 檢查用作單獨的測試。