【发布时间】:2015-02-11 16:05:09
【问题描述】:
在 bash test 表达式中使用 $@ 会产生奇怪的结果。
这是重现问题的最小测试脚本(在同一测试的替代公式中,确实通过且没有错误):
#! /bin/bash
# file path: ./bash_weirdness.sh
echo "args: '$@'"
echo "--- empty ---"
if test "" ; then echo "1.A1.TEST - not empty?"; fi
if test -z "" ; then echo "1.A2.EMPTY - empty?"; fi
if test -n "" ; then echo "1.A3.NE - not empty?"; fi
if ! test "" ; then echo "1.B1.NOT.TEST - empty?"; fi
if ! test -z "" ; then echo "1.B2.NOT.EMPTY - not empty?"; fi
if ! test -n "" ; then echo "1.B3.NOT.NE - empty?"; fi
echo "--- space ---"
if test " " ; then echo "2.A1.TEST - not empty?"; fi
if test -z " " ; then echo "2.A2.EMPTY - empty?"; fi
if test -n " " ; then echo "2.A3.NE - not empty?"; fi
if ! test " " ; then echo "2.B1.NOT.TEST - empty?"; fi
if ! test -z " " ; then echo "2.B2.NOT.EMPTY - not empty?"; fi
if ! test -n " " ; then echo "2.B3.NOT.NE - empty?"; fi
echo "--- \$@ ---"
if test "$@" ; then echo "3.A1.TEST - not empty?"; fi
if test -z "$@" ; then echo "3.A2.EMPTY - empty?"; fi
if test -n "$@" ; then echo "3.A3.NE - not empty?"; fi
if ! test "$@" ; then echo "3.B1.NOT.TEST - empty?"; fi
if ! test -z "$@" ; then echo "3.B2.NOT.EMPTY - not empty?"; fi
if ! test -n "$@" ; then echo "3.B3.NOT.NE - empty?"; fi
echo "--- \$* ---"
if test "$*" ; then echo "4.A1.TEST - not empty?"; fi
if test -z "$*" ; then echo "4.A2.EMPTY - empty?"; fi
if test -n "$*" ; then echo "4.A3.NE - not empty?"; fi
if ! test "$*" ; then echo "4.B1.NOT.TEST - empty?"; fi
if ! test -z "$*" ; then echo "4.B2.NOT.EMPTY - not empty?"; fi
if ! test -n "$*" ; then echo "4.B3.NOT.NE - empty?"; fi
前两个部分(“空”和“空格”)用于验证test、test -n 和test -z 是否正常工作;这就是混乱的严重程度。
当$@ 表示“无参数”时,即当$# 为零(0) 时,就会出现问题。
三个测试运行显示出了什么问题:注意“3.A3.NE - 不是空的?”第三轮报告:
$ ./bash_weirdness.sh x
->
args: 'x'
--- empty ---
1.A2.EMPTY - empty?
1.B1.NOT.TEST - empty?
1.B3.NOT.NE - empty?
--- space ---
2.A1.TEST - not empty?
2.A3.NE - not empty?
2.B2.NOT.EMPTY - not empty?
--- $@ ---
3.A1.TEST - not empty?
3.A3.NE - not empty?
3.B2.NOT.EMPTY - not empty?
--- $* ---
4.A1.TEST - not empty?
4.A3.NE - not empty?
4.B2.NOT.EMPTY - not empty?
这很好。
$ ./bash_weirdness.sh ""
->
args: ''
--- empty ---
1.A2.EMPTY - empty?
1.B1.NOT.TEST - empty?
1.B3.NOT.NE - empty?
--- space ---
2.A1.TEST - not empty?
2.A3.NE - not empty?
2.B2.NOT.EMPTY - not empty?
--- $@ ---
3.A2.EMPTY - empty?
3.B1.NOT.TEST - empty?
3.B3.NOT.NE - empty?
--- $* ---
4.A2.EMPTY - empty?
4.B1.NOT.TEST - empty?
4.B3.NOT.NE - empty?
这也很好。
$ ./bash_weirdness.sh
->
args: ''
--- empty ---
1.A2.EMPTY - empty?
1.B1.NOT.TEST - empty?
1.B3.NOT.NE - empty?
--- space ---
2.A1.TEST - not empty?
2.A3.NE - not empty?
2.B2.NOT.EMPTY - not empty?
--- $@ ---
3.A2.EMPTY - empty?
3.A3.NE - not empty?
3.B1.NOT.TEST - empty?
--- $* ---
4.A2.EMPTY - empty?
4.B1.NOT.TEST - empty?
4.B3.NOT.NE - empty?
不一点都不好:注意不正确的“3.A3.NE”结果。
【问题讨论】: