bash参数相等性检查的意外输出

时间:2019-05-24 10:14:30

标签: linux bash shell equality

我在Bash脚本中进行了基本的字符串相等性检查,但是输出不符合预期。

要进行复制,请将下面的代码复制到可执行文件 (在下面的示例中称为“部署”)

#!/bin/bash

echo $1

if [[ "$1" -eq "--help" ]] || [[ "$1" -eq "-h" ]]; then
    echo "hello"
fi


如果我这样运行脚本:

./deploy -h

输出为:

-h
hello

如果我这样运行脚本:

./deploy --help

输出为:

-help

为什么条件语句不能解析为true?

1 个答案:

答案 0 :(得分:4)

-eq比较整数。使用===比较字符串。

if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
    echo "hello"
fi

您可以省略引号。使用双括号时,==左侧的可变扩展名是安全的。

您也可以在括号内使用||。用单括号不可能做到这一点,但是双括号是一种语法功能,具有特殊的语法分析规则。

if [[ $1 == --help || $1 == -h ]]; then
    echo "hello"
fi

如果变得更加复杂,您还可以考虑使用case块。

case $1 in
    -h|--help)
        echo "hello";;
esac

  

如果-eq用于数值比较,./deploy -h会如何按预期工作?

算术评估通常会在给出非法表达式时显示一条错误消息,但实际上,您要求它评估的两个字符串在语法上是有效的。

  • -h对未定义变量$h的值求反。结果为0。
  • --help减少未定义的变量$help。结果是-1。

尝试输入无效的字符串,将会收到错误消息。

$ ./deploy 'foo bar'
bash: [[: foo bar: syntax error in expression (error token is "bar")
$ ./deploy @
bash: [[: @: syntax error in expression (error token is "@")