我正在运行一个小bash脚本,但我不明白为什么它要进入if块,即使条件应该为false。

$ cat script.sh
#!/bin/bash

if [[ "$@"="-h" || "$@"="--help" ]]
then
    echo 'Show help'
    exit
fi

echo 'Do stuff'
$ ./script.sh
Show help
$ bash -x script.sh
+ [[ -n =-h ]]
+ echo 'Show help'
Show help
+ exit
$ bash -x script.sh -option
+ [[ -n -option=-h ]]
+ echo 'Show help'
Show help
+ exit

那么,为什么当我没有传递任何参数时,$@等于-n?同样,即使是这样,-n =-h如何计算为真?当我传递一个参数-option时,为什么它也被计算为true?

最佳答案

空白是重要的。[[的参数之间必须有空格。

if [[ "$@" = "-h" || "$@" = "--help" ]]

另外,"$@"表示“所有命令行参数”。最好只检查一个参数。
if [[ "$1" = "-h" || "$1" = "--help" ]]

值得一提的是,[[中的变量扩展不必被引用。这并不伤害你,引用你的变量实际上是一个很好的习惯,但如果你想你可以删除引号。
if [[ $1 = -h || $1 = --help ]]

关于bash - 语句行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32810248/

10-13 09:32