我见过bash脚本测试非零长度字符串两种不同的方式。大多数脚本使用-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
哪个是更好的方法?
同样,这是测试零长度的更好方法:
if [ -z "$var" ]; then # Do something when var is zero-length fi
要么
if [ ! "$var" ]; then # Do something when var is zero-length fi
编辑:这是一个更完整的版本,显示[(aka测试)和[[。
下表显示了一个变量是否被引用,无论是使用单引号还是双引号,以及变量是否只包含空格,那么影响是否使用带-n / -z的测试是否适合检查变量。
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
如果您想知道变量是否为非零长度,请执行以下任一操作:
>在单括号中引用变量(第2a列)
>使用-n并在单括号中引用变量(列4a)
>使用带或不带引号的双括号,带或不带-n(列1b – 4b)
注意在列1a中从标记为“2”的行开始,结果指示[正在评估变量的内容,如同它们是条件表达式的一部分(结果与“T”或“F”在说明栏)。当使用[[使用(列1b)时,变量内容被视为字符串,不进行评估。
列3a和5a中的错误是由变量值包括空格而变量不引用的事实引起的。同样,如列3b和5b所示,[[将变量的内容计算为字符串。
如果你使用[,确保你没有得到意想不到的结果的关键是引用变量。使用[[,没关系。
被抑制的错误消息是“期望的一元运算符”或“期望的二进制运算符”。
这是生成上表的脚本。
#!/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 -r d t 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 a b part a -a Tstr -n a 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