既存のプログラムをデバッグしようとしましたが、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
動作[[
します。
答え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
私が興味を持っているのは、文句を言わないシェルを使うことです。
この文字列の名前の変数があっても同じ結果が得られます。