我想做一个独家或bash。当我定义变量a
和b
时,我可以使用它:
> a=1
> b=
> [ -z "$b" -a "$a" -o "$b" -a -z "$a" ] && echo yes
yes
但是,当我尝试使用我真正感兴趣的shell变量进行相同的构造时,它会失败:
> [ -z "$BASH_ARGV" -a "$@" -o "$BASH_ARGV" -a -z "$@" ] && echo sourced
bash: [: argument expected
发生了什么?
答案 0 :(得分:2)
"$@"
扩展为单个单词。您需要"$*"
或$# -gt 0
用那个"或"在中间,你可能想要:
[ -z "$BASH_ARGV" -a "$*" ] || [ "$BASH_ARGV" -a -z "$*" ]
或者,使用特定于bash的
[[ (-z "$BASH_ARGV" -a "$*") || ("$BASH_ARGV" -a -z "$*") ]]
击> <击> 撞击>
没关系:-a
的优先级高于-o
答案 1 :(得分:2)
"$@"
扩展为一个“单词”,这意味着如果没有脚本参数,它将扩展为空。另一方面,如果该数组存在,则"$BASH_ARGV"
会扩展为数组$BASH_ARGV
中的第一个值,否则为空。所以我不确定你真正想要比较的是什么。
但重点是"$@"
扩展为零或更多单词。如果它没有扩展为单个单词,那么表达式在语法上将是不正确的。 (可能。整个参数集可能恰好是一个有效的表达式。)
如果要将所有参数连接在一起,则应使用"$*"
。但这仍然不能与"$BASH_ARGV"
相提并论。它与"${BASH_ARGV[*]}"
也不具有可比性,但后者会更相似。
您也可以查看BASH_ARGC
。