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,

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top