在bash中testing非零长度的string:或

我见过bash脚本testing非零长度string两种不同的方式。 大多数脚本使用-n选项:

#!/bin/bash # With the -n option if [ -n "$var" ]; then # Do something when var is non-zero length fi 

但-n选项并不是真的需要:

 # Without the -n option if [ "$var" ]; then # Do something when var is non-zero length fi 

哪个更好?

同样的,这是testing零长度的更好的方法:

 if [ -z "$var" ]; then # Do something when var is zero-length fi 

要么

 if [ ! "$var" ]; then # Do something when var is zero-length fi 

编辑:这是一个更完整的版本,显示了[ (aka test )和[[

下表显示了是否引用variables,不pipe是使用单括号还是双括号,以及variables是否只包含空格,都会影响使用带或不带-n/-z的testing是否适合检查variables。

  1a 2a 3a 4a 5a 6a |1b 2b 3b 4b 5b 6b [ [" [-n [-n" [-z [-z" |[[ [[" [[-n [[-n" [[-z [[-z" unset: false false true false true true |false false false false true true null : false false true false true true |false false false false true true space: false true true true true false |true true true true false false zero : true true true true false false |true true true true false false digit: true true true true false false |true true true true false false char : true true true true false false |true true true true false false hyphn: true true true true false false |true true true true false false two : -err- true -err- true -err- false |true true true true false false part : -err- true -err- true -err- false |true true true true false false Tstr : true true -err- true -err- false |true true true true false false Fsym : false true -err- true -err- false |true true true true false false T= : true true -err- true -err- false |true true true true false false F= : false true -err- true -err- false |true true true true false false T!= : true true -err- true -err- false |true true true true false false F!= : false true -err- true -err- false |true true true true false false Teq : true true -err- true -err- false |true true true true false false Feq : false true -err- true -err- false |true true true true false false Tne : true true -err- true -err- false |true true true true false false Fne : false true -err- true -err- false |true true true true false false 

如果您想知道variables是否为非零长度,请执行以下任一操作:

  • 引用单个括号中的variables(第2a列)
  • 使用-n并引用单个括号中的variables(第4a列)
  • 使用带括号或不带引号的双括号,带或不带-n (第1b – 4b列)

请注意,在第1a列中,从标有“two”的行开始,结果表明[正在评估variables的内容 ,就好像它们是条件expression式的一部分一样(结果与“T”或“F”在说明栏中)。 当[[使用(列1b)]时,variables内容被视为一个string,不被评估。

列3a和5a中的错误是由variables值包含空格并且variables未加引号引起的。 同样,如列3b和5b所示, [[将variables的内容评估为一个string。

如果你正在使用[ ,关键是要确保你不会得到意想不到的结果是引用variables。 使用[[ ,没关系。

被抑制的错误消息是“一元运算符预期”或“二元运算符预期”。

这是制作上表的脚本。

 #!/bin/bash # by Dennis Williamson # 2010-10-06, revised 2010-11-10 # for http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var # designed to fit an 80 character terminal dw=5 # description column width w=6 # table column width t () { printf "%-${w}s" "true"; } f () { [[ $? == 1 ]] && printf "%-${w}s" "false " || printf "%-${w}s" "-err- "; } o=/dev/null echo ' 1a 2a 3a 4a 5a 6a |1b 2b 3b 4b 5b 6b' echo ' [ [" [-n [-n" [-z [-z" |[[ [[" [[-n [[-n" [[-z [[-z"' while read -rdt do printf "%-${dw}s: " "$d" case $d in unset) unset t ;; space) t=' ' ;; esac [ $t ] 2>$o && t || f [ "$t" ] && t || f [ -n $t ] 2>$o && t || f [ -n "$t" ] && t || f [ -z $t ] 2>$o && t || f [ -z "$t" ] && t || f echo -n "|" [[ $t ]] && t || f [[ "$t" ]] && t || f [[ -n $t ]] && t || f [[ -n "$t" ]] && t || f [[ -z $t ]] && t || f [[ -z "$t" ]] && t || f echo done <<'EOF' unset null space zero 0 digit 1 char c hyphn -z two ab part a -a Tstr -na Fsym -h . T= 1 = 1 F= 1 = 2 T!= 1 != 2 F!= 1 != 1 Teq 1 -eq 1 Feq 1 -eq 2 Tne 1 -ne 2 Fne 1 -ne 1 EOF 

这里是一些更多的testing

如果string不为空,则为true:

 [ -n "$var" ] [[ -n $var ]] test -n "$var" [ "$var" ] [[ $var ]] (( ${#var} )) let ${#var} test "$var" 

如果string为空,则为true:

 [ -z "$var" ] [[ -z $var ]] test -z "$var" ! [ "$var" ] ! [[ $var ]] ! (( ${#var} )) ! let ${#var} ! test "$var" 

case/esac来testing

 case "$var" in "") echo "zero length";; esac 

评估一个空的envvariables的替代方法或许更透明的方法是使用…

  if [ "x$ENV_VARIABLE" != "x" ] ; then echo 'ENV_VARIABLE contains something' fi