web-dev-qa-db-ja.com

bc:POSIXは関係演算子のスタンドアロン使用を禁止していますか?

2つの数値をbcと比較したい。このあたり StackOverflowでの高評価の回答 、私は次のような方法でそれを行うことができます:

printf '%s\n' '1.2 > 0.4' | bc

bc送信1からSTDOUTへ。ステートメントが真であることを示します(ステートメントが偽だった場合は0を返します)。

bcのPOSIXページごと

他のすべての演算子とは異なり、関係演算子( '<'、 '>'、 "<="、 "> ="、 "=="、 "!=")は、if、while、またはforステートメント内。

おそらく私は誤解しているかもしれませんが、この言語は上の例で使用されている構文を許可していないようです。

bcでの関係演算子のスタンドアロン使用はPOSIXの違反ですか?もしそうなら、私の例をどのように書き直すべきですか?

8
Harold Fischer

おそらく私は誤解しているかもしれませんが、この言語は上の例で使用されている構文を許可していないようです。

この例では、GNU bcと想定しています。これにより、独自の拡張機能がbc言語に追加されます。 manual で説明されているように、-sスイッチを使用して、正確なPOSIX bc言語を処理するか、-w拡張機能について警告する場合は切り替えます。

$ echo '1.2 > 0.4' | bc -s
(standard_in) 2: Error: comparison in expression
$ echo '1.2 > 0.4' | bc -w
(standard_in) 2: (Warning) comparison in expression
1
$ echo '1.2 > 0.4' | bc
1

もしそうなら、私の例をどのように書き直すべきですか?

$ printf 'if(%s > %s){a=1};a\n' 1.2 0.4 | bc -s
1

@icarusのおかげで、目が短くて簡単になりました。

11
mosvy