我在Bash脚本中进行了基本的字符串相等性检查,但是输出不符合预期。
要进行复制,请将下面的代码复制到可执行文件 (在下面的示例中称为“部署”) 。
#!/bin/bash
echo $1
if [[ "$1" -eq "--help" ]] || [[ "$1" -eq "-h" ]]; then
echo "hello"
fi
如果我这样运行脚本:
./deploy -h
输出为:
-h
hello
如果我这样运行脚本:
./deploy --help
输出为:
-help
为什么条件语句不能解析为true?
答案 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 "@")