【问题标题】:bash multiple expressions in an if statement with "$@"使用“$@”在 if 语句中 bash 多个表达式
【发布时间】:2014-03-21 00:31:59
【问题描述】:

我想在 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

发生了什么事?

【问题讨论】:

  • 如果你只是想看看参数个数是否非零,看看$#。如果您只关心 $@ 包含的条目数,则无需查看其实际值。

标签: bash shell if-statement


【解决方案1】:

"$@" 每个脚本参数扩展为一个“单词”,这意味着如果没有脚本参数,它将扩展为空。另一方面,"$BASH_ARGV" 扩展为数组 $BASH_ARGV 中的第一个值,如果该数组存在,否则为空。所以我不确定你到底想比较什么。

但重点是"$@" 扩展为零个或多个单词。如果它没有扩展到单个单词,那么您的表达式将在语法上不正确。 (可能。有可能整个参数集恰好是一个有效的表达式。)

如果您想将所有参数连接在一起,您应该使用"$*"。但这仍然无法与"$BASH_ARGV" 相提并论。它也不能与"${BASH_ARGV[*]}" 相比,但后者会更相似。

您可能也想查看BASH_ARGC

【讨论】:

【解决方案2】:

"$@" 扩展为单个单词。你想要"$*"$# -gt 0

中间有那个“或”,你可能想要:

[ -z "$BASH_ARGV" -a "$*" ] || [ "$BASH_ARGV" -a -z "$*" ]

或者,使用 bash 特定的

[[ (-z "$BASH_ARGV" -a "$*") || ("$BASH_ARGV" -a -z "$*") ]]

没关系:-a 的优先级高于 -o

【讨论】:

  • 我通常只使用$1。是的,从技术上讲,它可能是空字符串,但这不太可能是偶然发生的。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多