引数としてゼロを渡すと、偽の肯定(「True」印刷)が発生するのはなぜですか?
#!/bin/zsh
k="$1"
if ((0 < k < 1))
then
echo "True"
fi
スクリプト名はStitch_applier.shです。
端末
% ./stitch_applier.sh 0
True
これはLinuxシステムで実行されます。
答え1
シェル算術は、これらの接続比較をサポートしません。代わりに、最初のものは関係が真であるかどうかに応じてORをa < b
返します。1
0
もしそうならk
、それは左の関連付けの場合と同じ0
です。 0 は 0 より小さくなく、偽であるため、算術的文脈で 。それから私たちはこれが真実であり、それがすべてであることを知ります。((0 < k < 1))
((0 < 0 < 1))
(( (0 < 0) < 1))
0 < 0
0
0 < 1
k
範囲内であることをテストするには、次の手順を実行する必要があります((0 < k && k < 1))
。
Bashなどのシェルや他の多くのシェルは整数算術のみを処理し、0と1の間の整数はないため、これらのシェルではテストは常に失敗します。ただし、KshとZshは浮動小数点数を処理できます。
オペレーターはそうです。C言語で作業する、そしてPOSIX、吹くそしてジッシュ算術演算子のC定義を参照してください。 (POSIXは$(( ))
定義されておらず、定義のみを定義し(( ))
ますが、BashとZshは両方とも同じ方法で算術を処理します。そうでなければ混乱するでしょう。)
いくつかの最新の言語は異なる動作します。 Pythonはおなじみで有名です。 接続比較サポートと錆そしてC++同様のサポートを追加することは、少なくとも議論されています。 C ++ドキュメントのコメントと同様に、誰もa < b < c
意図的にCの意味でコメントを使用しません。 ((a < b) != (c < d)
同様の目的があるかもしれません。関係の1つが正しいことを確認してください。)PerlとGNU awkは1 < 2 < 3
。