web-dev-qa-db-fra.com

bc: POSIX interdit-il l'utilisation autonome d'opérateurs relationnels?

Je veux comparer deux nombres avec bc. Par cela réponse très bien cotée sur StackOverflow , je peux le faire d'une manière telle:

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

bc envoie 1 à STDOUT, indiquant que la déclaration est vraie (elle aurait renvoyé 0 si la déclaration était fausse).

Par la page POSIX pour bc :

Contrairement à tous les autres opérateurs, les opérateurs relationnels ('<', '>', "<=", "> =", "==", "! =") Ne doivent être valides que comme objet d'un if, tandis que, ou à l'intérieur d'une instruction for.

Je me trompe peut-être, mais ce langage semble interdire la syntaxe utilisée dans l'exemple ci-dessus.

L'utilisation autonome d'opérateurs relationnels dans bc est-elle une violation de POSIX? Si oui, comment dois-je réécrire mon exemple?

8
Harold Fischer

Je me trompe peut-être, mais ce langage semble interdire la syntaxe utilisée dans l'exemple ci-dessus.

Cet exemple suppose que GNU bc, qui ajoute ses propres extensions au langage bc. Comme indiqué dans son manuel , vous devez utiliser le -s commutateur pour lui faire traiter le langage bc POSIX exact, ou le -w changez si vous voulez qu'il vous avertisse des extensions:

$ 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

Si oui, comment dois-je réécrire mon exemple?

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

merci @icarus pour la version plus courte et plus facile pour les yeux.

11
mosvy