2010-08-20 7 views
3

Dans le code suivant, j'essaie de passer shell varibale à awk. Mais quand j'essaie de l'exécuter en tant que a.sh foo_bar la sortie imprimée est "foo n'est pas déclarée" et quand je l'exécute en tant que bar.bar bar, la sortie imprimée est "foo est déclarée". Y at-il un bug dans awk ou je fais quelque chose de mal ici? J'utilise gawk-3.0.3.Variable Shell interprétée à tort dans awk

#!/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 est un fichier avec une seule ligne vide.

Merci,

Répondre

1

Ce n'est pas un bogue, mais une erreur dans votre code. La ligne est problématique:

if ( ismodel != foo) { 

Ici foo devrait être "foo". En ce moment vous comparez avec une variable vide. Cela donne faux quand vous avez une correspondance, et vrai quand vous n'avez pas de correspondance. Donc, le problème n'est pas la façon dont vous utilisez les variables shell.

Mais comme l'ont dit les autres répondeurs, le meilleur moyen de passer les arguments à awk est d'utiliser le commutateur -v. Cela fonctionnera également lorsque vous décidez de mettre votre script awk dans un fichier séparé et empêche toute sorte de problèmes de citation.

Je ne suis pas sûr de votre utilisation d'un fichier fictif. Est-ce juste pour l'exemple? Sinon, vous devez omettre le fichier et mettre tout votre code dans le bloc BEGIN {}.

+0

Merci schot! Cela fonctionne comme vous l'avez dit. Le mannequin juste par exemple ici. –

0

utiliser l'option pour passer dans la variable de la coquille

awk -v model="$1" '{ 
    match(model, /foo/) 
    ..... 
} 
' dummy 
2

Vous devez utiliser le passage variable AWK au lieu de complexe citer:

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

Votre script est écrit comme un script shell, mais vous avez une ligne AWK shebang. Vous pouvez changer cela en #!/bin/sh.

+0

mon erreur en collant le code ici (chose #!/Bin/awk). Le probelm peut être résolu si je passe en utilisant la variable en utilisant l'option -v. Mais la question reste la même: pourquoi awk compare-t-il la comparaison? Et si -v est la seule option pour passer la variable shell, awk shouldn imprime toujours "foo n'est pas déclaré" .right? –

Questions connexes