Shell-Variable interpretiert falsch in awk
Frage
Im folgenden Code Ich versuche, Shell Varibale an awk übergeben. Aber wenn ich versuche, es als a.sh gedruckt foo_bar dem Ausgang zu laufen ist „foo nicht deklariert ist“ und wenn ich es als a.sh bar_bar laufen die Ausgabe gedruckt ist „foo deklariert wird“. Gibt es einen Fehler in awk oder ich etwas falsch hier tue?
Ich bin mit gawk-3.0.3.
#!/bin/awk
model=$1
awk ' {
match("'$model'", /foo/)
ismodel=substr("'$model'", RSTART, RLENGTH)
if ( ismodel != foo ) {
print " foo is not declared"
} else {
print " foo is declared"
}
}
' dummy
Dummy-Datei mit einzelner Leerzeile.
Danke,
Lösung
Dies ist kein Fehler, sondern ein Fehler im Code. Die problematische Zeile ist:
if ( ismodel != foo ) {
sollte hier foo
"foo"
sein. Gerade jetzt Sie mit einer leeren Variable vergleichen. Dies gibt falsch, wenn Sie ein Spiel haben, und dann, wenn Sie kein Spiel haben. Das Problem ist also nicht so, wie Sie die Shell-Variablen verwenden.
Aber wie die anderen Beantworter gesagt haben, ist der bevorzugte Weg, Argumente zu awk
der Weitergabe von dem -v
Schalter. Dies funktioniert auch, wenn Sie Ihren awk-Skript in einer separaten Datei und verhindert jede Art von zitierte Fragen stellen sich entscheiden.
Ich bin auch nicht sicher über Ihre Benutzung einer Dummy-Datei. Ist dies nur für das Beispiel? Andernfalls sollten Sie die Datei auslassen und alle im BEGIN {}
Block Code setzen.
Andere Tipps
Sie sollten AWK der Variablen anstelle komplexen Übergang zu zitieren:
awk -v awkvar=$shellvar 'BEGIN {print awkvar}'
Das Skript wird als ein Shell-Skript geschrieben, aber Sie haben eine Linie shebang AWK. Sie könnten die zu #!/bin/sh
ändern.
verwendet Option -v in Variable übergeben von der Shell
awk -v model="$1" '{
match(model, /foo/)
.....
}
' dummy