为什么 [[ ]] 中的这个字符串匹配条件不成立?

为什么 [[ ]] 中的这个字符串匹配条件不成立?
$ tpgid=$(ps  --no-headers -o tpgid -p 1)
$ echo $tpgid
-1
$ if [[ $tpgid == "-1" ]]; then
>     echo "yes"
> else
>     echo "no"
> fi
no

为什么条件不成立?谢谢。

$ printf "%s" "$tpgid" > /tmp/test/fff
$ hd /tmp/test/fff
00000000  20 20 20 2d 31                                    |   -1|
00000005

答案1

尽管[[ ... ]][ ... ]or “更智能” test ...,但显式使用数字比较运算符仍然是一个更好的主意:

if [[ "$tpgid" -eq -1 ]]; then ...

此外,你的十六进制转储:

$ hd /tmp/test/fff
00000000  20 20 20 2d 31                                    |   -1|

表明$tpgid扩展为" -1",而不是"-1"-eq知道如何处理这个问题,同时==正确地进行字符串比较:

$ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
falsy
$ if [[ "   -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
truthy

简而言之,字符串匹配条件没有返回 true,因为字符串实际上返回 true不是匹配。

答案2

最有可能的是$tpgid包含前导和/或尾随空格。由于该值是数字,您可能需要使用算术表达式:

if (( tpgid == -1 )); then ...

相关内容