$記号のないUnix AIX変数?

$記号のないUnix AIX変数?

既存のプログラムをデバッグしようとしましたが、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-01Debianのパッケージ(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動作[[します。

おすすめ記事