[[]]の文字列一致条件が維持されないのはなぜですか?

[[]]の文字列一致条件が維持されないのはなぜですか?
$ 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 ...

また、16進ダンプは次のとおりです。

$ 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

つまり、文字列が実際に真を返したため、文字列一致条件は真を返しませんでした。いいえマッチ。

答え2

ほとんど$tpgidの場合、先行および/または末尾のスペースが含まれています。値は数値なので、算術式を使用する必要があります。

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

関連情報