UPDATE: Meine vorgeschlagene Lösung stellt sich als potentiell gefährlich heraus. Eine bessere Lösung finden Sie unter Ed Morton's answer. Ich werde diese Antwort hier als Warnung hinterlassen.
Wegen der einfachen Anführungszeichen wird $root
von awk interpretiert, nicht von der Shell. awk behandelt root
als nicht initialisierte Variable, deren Wert die leere Zeichenfolge ist, die in einem numerischen Kontext als 0
behandelt wird. $root
ist das root
'Feld der aktuellen Zeile - in diesem Fall als $0
, das ist die gesamte Zeile. Da es in einem BEGIN
Block ist, gibt es keine aktuelle Zeile, also $root
ist die leere Zeichenfolge - die wiederum als 0
behandelt wird, wenn sie an sqrt()
übergeben wird.
Sie können dies sehen, indem Sie Ihre Befehlszeile ein wenig zu ändern:
$ awk 'BEGIN { print sqrt("") }'
0
$ echo 2 | awk '{ print sqrt($root) }'
1.41421
HINWEIS: Die oben ist nur zu zeigen, was mit dem ursprünglichen Befehl falsch ist, und wie es von der Shell und von awk interpretiert wird.
Eine Lösung besteht darin, doppelte Anführungszeichen anstelle von einfachen Anführungszeichen zu verwenden. Die Shell erweitert Variablenreferenzen innerhalb von Anführungszeichen:
Sie müssen vorsichtig sein, wenn Sie so etwas tun. Die Interaktion zwischen Zitaten und variabler Expansion in der Shell vs. awk kann kompliziert sein.
UPDATE: In der Tat, müssen Sie extrem vorsichtig sein. Wie Ed Morton in einem Kommentar hervorhebt, kann diese Methode bei einem bösartigen Wert für $x
zu willkürlicher Codeausführung führen, was immer ein Risiko für einen Wert darstellt, der von Benutzereingaben gelesen wird. His answer vermeidet dieses Problem.
(Beachten Sie, dass ich den Namen des Shell-Variable $root
-$x
geändert haben, da sie die Zahl, deren Quadratwurzel ist wollen Sie, nicht die Wurzel selbst.)
Bash-Variablen werden nicht in einfache Anführungszeichen erweitert. Entweder in doppelte Anführungszeichen wechseln oder eine 'awk'-Variable mit' -v '-Option definieren. – karakfa