既存のプログラムをデバッグしようとしましたが、if条件の前に$記号が付いていないことがわかりました。
値は次のとおりです。
dt_val=1234
prev_dt_val=1234
条件が次の場合:
if [ dt_val -eq prev_dt_val ]
then
echo "Equal"
else
echo "Not equal"
fi
Result:
Equal
$記号なしで条件文がどのように正しく機能するかを説明できますか?
そうじゃないですか…?
[ $dt_val -eq $prev_dt_val ]
文字列値を比較すると、同じ条件が失敗します。これは、この条件に数字で$記号が必要ないことを意味しますか?
追加情報:
提案されているように、文字列を==と比較します。
dt_val="abcd"
prev_dt_val="abcd"
if [ dt_val == prev_dt_val ]
> then
> echo Equal
> else
> echo Not equal
> fi
Not equal
シェル情報:
echo $SHELL
/usr/bin/ksh
Version M-11/16/88f
なぜエラーがないのだろうか。
ベストアンサー1
の組み込み関数は、Bashがandに対して行うように、ksh
算術コンテキストで[
asのオペランドを使用します。算術的文脈では、変数に符号は必要ありません。-eq
[[
-eq
$
$ ksh -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=1 b=2; if [ a -eq b ]; then echo equal; else echo different; fi'
different
でも:
$ ksh -c 'a=2 b=8; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=2 b=9; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
different
(ただし、*
まだワイルドカードなのでa*4
そこに引用しなければなりません。)
ksh --version
表示されているのは、sh (AT&T Research) 93u+ 2012-08-01
Debianのパッケージ(ksh
パッケージバージョン)であるksh93です93u+20120801-3.1
。 Debianでも同じ結果が得られたmksh
ので、ここではksh88が十分に近いと思います。
比較のために、Bashでは次のエラーが発生します。
$ bash -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
bash: line 0: [: a: integer expression expected
different
(エラー時にfalse値が返され、different
印刷されます。)[
それで[[
動作します:
$ bash -c 'a=1 b=1; if [[ a -eq b ]]; then echo equal; else echo different; fi'
equal
ZshはここでBashと同じで、[
バグがあり、a -eq b
動作[[
します。