[英]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
我有點喜歡case
在if [ "${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.