簡體   English   中英

Shell腳本 - 如果變量為null或為空,則退出腳本

[英]Shell script - exiting script if variable is null or empty

我期望在我的bash腳本中使用下面的變量,但是如果這是空的或null,那么處理它並退出腳本的最佳方法是什么。

tag=$1  

我看到'set -u'的答案。 我知道這會有效,但這對生產環境有益嗎?

有一個內置運算符,要求設置變量。 如果不是,這將導致腳本退出。

tag=${1?Need a value}

通常這與腳本開頭附近的: no-op一起使用。

: ${1?Need a value}

“未設置或空”的混合有些不同。 沒有用於退出空值但設置值的類似構造,但您可以輕松使用相關語法${var:-default} ,如果設置${var:-default}空,則擴展為$var ,否則為default 還有${var-default} ,只有在正確取消設置變量時才會生成default

當您想要使用set -u但需要處理可能未設置的變量時,這可能特別有用:

case ${var-} in '') echo "$0: Need a value in var" >&2; exit 1;; esac

我有點喜歡caseif [ "${var-}" = '' ]主要是因為它節省了我不必換雙引號${var-} ,並在價值的討厭情況下$var它被解釋作為[的選項[並在您最不期望的時候給出錯誤消息。 (在Bash, [[沒有這些問題;但我更喜歡堅持使用POSIX shell。)

如果要測試變量是非空的,可以執行以下操作:

if [ -z "$tag" ]; then
    exit 1
fi

test手冊:

-z STRING

STRING的長度為零

鑒於您正在使用腳本的位置參數,您還可以通過查看$#測試您收到的參數數量。

沒有人建議:? 選項。

如果要確保設置變量而不是null:

SEARCH_PATH=${DAYS_TO_KEEP:?Must provide DAYS_TO_KEEP.}

將立即退出代碼2並打印一條消息:

/entrypoint.sh: line 17: SEARCH_PATH: Must provide DAYS_TO_KEEP.

我不確定您是否要檢測變量是否未unset或為empty 這是兩件不同的事情。 具體來說,可以設置變量但是為空:

$ var=""
$ if [ -z "$var" ]; then echo empty; fi
$ empty

這里也是如此:

#!/usr/bin/env bash

set -u
echo $1

測試:

$ ./test.sh
./test.sh: line 4: $1: unbound variable
$ ./test.sh ""

$

或者在這里:

#!/usr/bin/env bash

tag=${1?Need a value}
echo $tag

測試:

$ ./se.sh
./se.sh: line 3: 1: Need a value
$ ./se.sh ""

$

其他海報提供了檢測未設置和空變量的正確方法。 我個人喜歡這種檢測空和未設置變量的方法:

#!/usr/bin/env bash

if [ "$1"A = A ]
then
    echo variable is empty or unset
fi

測試:

$ ./empty.sh ""
variable is empty or unset
$ ./empty.sh
variable is empty or unset
$ ./empty.sh 1
$

我更喜歡Perl如何使用“die”,並且很容易在shell中做類似的事情。

# Print (optional) error message and exit
# Usage: die [[msg] exit_status]
die() {
    [[ -n "$1" ]] && echo "$1"
    [[ -n "$2" ]] && exit $2 || exit 1
}

[[ -n "$tag" ]] || die "Need a tag argument.  Use $0 --help for details"

這假定為bash或Korn shell,但可以通過將[[]]更改為[]來轉換為經典Bourne shell。

使用模式匹配來檢測值是否僅包含空格:

pattern=$'*( |\t)'
if [[ $1 = $pattern ]]; then
    echo "First parameter has no non-whitespace characters"
    exit 1
fi

$'...'引用可以更輕松地向字符串添加制表符。 擴展模式*(...)匹配括號內的模式的0或更多(類似於正則表達式( |\\t)* )。 模式被賦值給變量,因為=如果引用右側操作數的任何部分,則執行精確的字符串匹配,因此我們事先執行引用以便更容易設置值。

以下測試確保變量為Null或賦值給它。雙引號非常重要,必須使用!

VAL= # Creates a NULL variable
if [[ -z "$VAL" && "$VAL" = ’’ ]]
then
echo "The VAL variable is NULL"
fi
or
VAL=25
if [[ ! -z "$VAL" && "$VAL" != ’’ ]]
then
echo "The VAL variable is NOT NULL"
fi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM