Co jest nie tak z poniższym poleceniem
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Wynik :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Co jest nie tak z poniższym poleceniem
awk 'BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}'
Wynik :
awk: BEGIN {a = 5;b=6; (a==b)? print "a==b" : print "a!=b"}
awk: ^ syntax error
Odpowiedzi:
Podobnie jak wiele innych języków programowania, awkrozróżnia wyrażenia i instrukcje. Ogólnie rzecz biorąc, instrukcje są działaniami, które są wykonywane, podczas gdy wyrażenia są obliczeniami, które dają wartość.
Potrójny operator w awk, podobnie jak jego odpowiednik w C, skąd pochodzi, sam jest wyrażeniem (a nie instrukcją), który oczekuje trzech innych wyrażeń jako expr1 ? expr2 : expr3. printjest stwierdzeniem. Nie można go użyć tam, gdzie wymagane jest wyrażenie, stąd błąd składniowy.
Próbowałeś awk 'BEGIN {a = 5;b=6; print (a==b)? "a==b" : "a!=b"}'?
Użycie instrukcji, w której wywoływane jest wyrażenie, nie ma sensu. Instrukcje nie zwracają wartości. Więc kiedy masz condition ? stmt1 : stmt2, jaką wartość oblicza operator trójskładnikowy? Jeśli conditionjest fałszem, powinna to być wartość, stmt2ale to nie jest wartość, to akcja.
x = if true; print "yes"; else; print "no"; end
(cond1) ? printf("str1") : printf("str2")? Dzięki wyjaśniając subtelności trójki. EDYCJA: w rzeczywistości przy użyciu następującej brzydkiej konstrukcji: str = (cond1) ? sprintf("str1") : sprintf("str2"); printf("%s", str)działa, ale w tym momencie jest prawie tak zwarta i znacznie bardziej przejrzysta w użyciu, jeśli / jeszcze :)