Domanda

Nel seguente codice che sto cercando di passare varibale shell per awk. Ma quando provo a farlo funzionare come a.sh foo_bar l'output di stampa è "pippo non è dichiarato" e quando l'eseguo come bar_bar a.sh l'output di stampa è "pippo è dichiarato". C'è un bug in awk o sto facendo qualcosa di sbagliato qui?

Sto usando 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

manichino è il file con la singola riga vuota.

Grazie,

È stato utile?

Soluzione

Questo non è un bug, ma un errore nel codice. La linea è problematico:

if (  ismodel != foo ) {

Qui foo dovrebbe essere "foo". In questo momento si stanno confrontando con una variabile vuota. Questo dà false quando si dispone di un match, e vera quando si ha alcuna corrispondenza. Quindi il problema non è il modo di usare le variabili di shell.

Ma come gli altri answerers hanno già detto, il modo preferito di passare argomenti a awk è utilizzando l'opzione -v. Questo funziona anche quando si decide di mettere il vostro script awk in un file separato e impedisce ogni tipo di citare problemi.

Sono, inoltre, non sicuro circa l'utilizzo di un file fittizio. E 'solo per l'esempio? In caso contrario, si dovrebbe omettere il file e mettere tutto il codice nel blocco BEGIN {}.

Altri suggerimenti

Si dovrebbe usare variabili di AWK passando al posto del complesso citando:

awk -v awkvar=$shellvar 'BEGIN {print awkvar}'

Lo script è scritto come uno script di shell, ma si ha la linea di AWK shebang. Si potrebbe cambiare la situazione a #!/bin/sh.

usare opzione -v per passare in variabile dalla shell

awk -v model="$1" '{
  match(model, /foo/)
   .....
}
' dummy
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top