zsh を使用して、数値が範囲内にあることを確認します。

zsh を使用して、数値が範囲内にあることを確認します。

引数としてゼロを渡すと、偽の肯定(「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返します。10

もしそうならk、それは左の関連付けの場合と同じ0です。 0 は 0 より小さくなく、偽であるため、算術的文脈で 。それから私たちはこれが真実であり、それがすべてであることを知ります。((0 < k < 1))((0 < 0 < 1))(( (0 < 0) < 1))0 < 000 < 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

おすすめ記事