在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