変数を文字列または整数で比較する際に重要な違いはありますか?

変数を文字列または整数で比較する際に重要な違いはありますか?

不思議なことに、bash変数の比較(値はan)を実行するときに、integeranまたはaと宣言された事前定義さintれた値についてテストできますstring

サンプルスクリプト:

#!/bin/bash
f1()
{
        [ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string"
}

f2()
{
        [[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int"
}

f1 $1
f2 $1

出力:

$  ./param.sh 1
f1: "1" compared as string
f2: "1" compared as int

そして

$  ./param.sh blah
$

どちらの関数も同じように動作するので、整数変数をチェックするときに好む方法があるかどうか疑問に思います。もっと厳しいので、intvsを確認したいのですが、これintは欠点があるかどうか疑問に思いますstring

この場合、f2()比較もさらに厳しくなる。つまり、10進値を渡すと値が壊れますが、渡すとf1()問題はありません。

ベストアンサー1

はい、多くの違いがあります。たとえば、=文字列がまったく同じであることを確認し、-eq同じであることを確認する前に、両方の式に対して算術を実行します。

$ [ " 1 " -eq 1 ] && echo equal || echo not
equal
$ [ " 1 " = 1 ] && echo equal || echo not
not

$ [ +1 -eq 1 ] && echo equal || echo not
equal
$ [ +1 = 1 ] && echo equal || echo not
not

$ [ "0+1" -eq 1 ] && echo equal || echo not
equal
$ [ "0+1" = 1 ] && echo equal || echo not
not

さらに、空の文字列は数値で正確にゼロに等しくなります。

$ [ "" -eq 0 ] && echo equal || echo not
equal
$ [ "" = 0 ] && echo equal || echo not
not

比較演算子を導入すると、別の種類の違いが発生します。たとえば、<vsを考えてみましょう。-lt

$ [[ 2 -lt 10 ]] && echo less || echo not
less
$ [[ 2 < 10 ]] && echo less || echo not
not

これは、文字列「2」が文字列「10」の後にアルファベット順に続くが(1が2よりも前にあるため)、数字「2」が数字「10」より数値的に小さいためです。

おすすめ記事