variabile shell male interpretato in awk
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,
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