我希望在我的 bash 脚本中使用以下变量,但如果它为空或 null,处理它并退出脚本的最佳方法是什么。
tag=$1
我看到带有“set -u”的答案。我知道这会起作用,但这对生产环境有好处吗?
有一个内置运算符用于要求设置变量。如果不是,这将导致脚本退出。
tag=${1?Need a value}
通常这与脚本开头附近的
:
无操作一起使用。
: ${1?Need a value}
“未设置或空”的合并有些不同。没有类似的构造用于在空但设置的值上退出,但您可以轻松使用相关语法
${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
echo "variable tag is empty so program will exit now!"
exit 1
fi
来自
test
的手册:
-z 字符串
STRING 的长度为零
鉴于您正在使用脚本的位置参数,您还可以通过查看
$#
来测试收到的参数数量。
没有人建议
:?
选项。
如果您想确保变量已设置且不为空:
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
$
使用模式匹配来检测该值是否仅包含空格:
pattern=$'*( |\t)'
if [[ $1 = $pattern ]]; then
echo "First parameter has no non-whitespace characters"
exit 1
fi
$'...'
引号可以更轻松地向字符串添加制表符。扩展模式 *(...)
匹配 0 个或多个括号内的模式(类似于正则表达式 ( |\t)*
)。该模式被分配给一个变量,因为如果其右侧操作数的任何部分被引用,=
将执行精确的字符串匹配,因此我们预先执行引用以便更容易设置值。
我更喜欢 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。
以下测试确保变量为 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