不思議なことに、bash変数の比較(値はan)を実行するときに、integer
anまたは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
$
どちらの関数も同じように動作するので、整数変数をチェックするときに好む方法があるかどうか疑問に思います。もっと厳しいので、int
vsを確認したいのですが、これ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」より数値的に小さいためです。