我期待在我的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