Shell脚本 – 如果variables为空或空,则退出脚本

我期待在我的bash脚本中使用下面的variables,但在这种情况下,如果这是空或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 

if [ "${var-}" = '' ]我更喜欢case ,主要是因为它省去了${var-}双引号,而$var的麻烦大于$var作为一个选项[当你最不期待的时候给你一个错误信息。 (在Bash中, [[没有这些问题;但是我更喜欢坚持POSIX shell。

如果你想测试一个变量是非空的,你可以这样做:

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

test手册:

-Z STRING

STRING的长度为零

鉴于您正在使用脚本的位置参数,您还可以通过查看$#测试您收到的参数的数量。

我不确定是否要检测变量是未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如何使用“死”,并且在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或者korne 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