Що не так із командою нижче
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Вихід:
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Що не так із командою нижче
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Вихід:
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Відповіді:
Як і багато інших мов програмування, awk
розрізняє вирази та заяви. За великим рахунком, оператори - це дії, які виконуються, тоді як вирази - це обчислення, які призводять до значення.
Потрійний оператор в awk
, як і його аналог на C, звідки він походить, сам по собі є виразом (а не твердженням), який очікує, що три інші вирази як expr1 ? expr2 : expr3
. print
є заявою. Його не можна використовувати там, де викликається вираз, отже, синтаксична помилка.
Ви пробували awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'
?
Використання оператора, у якому викликається вираз, не може мати сенсу. Виписки не повертають значення. Отже, коли у вас є condition ? stmt1 : stmt2
, яке значення обчислює потрійний оператор? Якщо condition
false, це має бути значення, stmt2
але це не значення, це дія.
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")
? Спасибі поясненням тонкощів потрійного. EDIT: насправді, використовуючи таку потворну конструкцію: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
працює, але на даний момент її майже так само компактно і набагато зрозуміліше використовувати, якщо / ще :)