使用" $ @"在if语句中使用多个表达式进行bash

时间:2014-03-21 00:31:59

标签: bash shell if-statement

我想做一个独家或bash。当我定义变量ab时,我可以使用它:

> 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

发生了什么?

2 个答案:

答案 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