$記号のない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動作[[します。

答え2

$まず、スクリプトはあなたが見つけたように前に変数名がないので、変数を評価しません。

-eq次に、test()コマンド[に数値比較演算子を使用するため、「Equal」を出力します。数値ではなく2つの文字列が引数として渡されるため、両方とも同じ数値で評価されるため、「等しい」文字列が出力されます。

少なくともbashバージョンは、次のように文句を言います。

$ if [ 0 -eq bla ]; then echo yes; fi
-bash: [: bla: integer expression expected

私のダッシュバージョンも次のように文句を言います。

$ if [ 0 -eq bla ]; then echo yes; fi
dash: 1: [: Illegal number: bla

私が興味を持っているのは、文句を言わないシェルを使うことです。

この文字列の名前の変数があっても同じ結果が得られます。

関連情報