微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在bash中测试非零长度字符串:[-n“$ var”]或[“$ var”]

我见过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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐