Quel est le problème avec la commande ci-dessous
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Production :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Comme beaucoup d'autres langages de programmation, fait la awk
distinction entre les expressions et les instructions. Dans l'ensemble, les instructions sont des actions qui sont exécutées, tandis que les expressions sont des calculs qui aboutissent à une valeur.
L'opérateur ternaire dans awk
, comme son homologue en C d'où il vient, est lui-même une expression (et non une instruction) qui attend trois autres expressions comme expr1 ? expr2 : expr3
. print
est une déclaration. Il ne peut pas être utilisé là où une expression est requise, d'où l'erreur de syntaxe.
As-tu essayé awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'
?
L'utilisation d'une instruction dans laquelle une expression est demandée n'a aucun sens. Les instructions ne renvoient pas de valeurs. Donc, quand vous l'avez condition ? stmt1 : stmt2
, quelle est la valeur calculée par l'opérateur ternaire? Si condition
est faux, ce devrait être la valeur de stmt2
mais ce n'est pas une valeur, c'est une action.
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")
? Merci d'expliquer les subtilités du ternaire. EDIT: en fait, en utilisant la construction laide suivante:str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
fonctionne, mais à ce stade, c'est presque aussi compact et beaucoup plus clair à utiliser si / autre :)