Что не так с приведенной ниже командой
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
различает выражения и операторы. В общем, операторы - это действия, которые выполняются, а выражения - вычисления, которые приводят к значению.
Тернарный оператор in awk
, как и его аналог в C, откуда он взят, сам является выражением (а не оператором), который ожидает три других выражения as 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")
? Спасибо, объясняя тонкости троичного. РЕДАКТИРОВАТЬ: на самом деле, используя следующую уродливую конструкцию: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)
работает, но на данный момент она почти такая же компактная и гораздо более понятная для использования, если / еще :)