Table des matières

Script awk - Deux shebang


Il est question de script awk/gawk utilisant un shebang approprié.

1er shebang : #!/bin/awk -f

Avec le shebang #!/bin/awk -f les options passées sur la ligne de commande appelant le script sont traitées comme des options pour awk.
Ainsi avec un script du genre :

#!/bin/awk -f
BEGIN {
    for (i=0; i<ARGC; i++) printf("Argument %d : %s\n", i, ARGV[i])
    if (var) printf("La variable vaut %s\n",var)
}

Et en l'appelant comme ceci :

./script_awk -v var="VAR"

Le retour donne

Argument 0 : gawk
La variable vaut VAR

L'option -v a été traitée par awk, on ne la voit pas apparaître dans le tableau des arguments.
Ok, ça peut-être pratique.
On peut passer des variables à un programme awk, changer le comportement d'un script …

2ième shebang : #!/bin/awk -E

Mais si mon script awk a ses propres options, il risque d'y avoir des “interférences” avec les options d' awk.
Pour cela, il existe une option d' awk qui permet de ne plus considérer les options de la ligne de commande tout en exécutant le “fichier programme”.
C'est un peu comme -f sauf que je vais devoir traiter la ligne de commande dans mon script awk.
Cette option est -E et le shebang devient : #!/bin/awk -E
Et donc avec le même script, on n'obtient pas le même retour :

#!/bin/awk -E
BEGIN {
    for (i=0; i<ARGC; i++) printf("Argument %d : %s\n", i, ARGV[i])
    if (var) printf("La variable vaut %s\n",var)
}

L'appel :

./script_awk -v var="VAR"

Le retour :

Argument 0 : gawk
Argument 1 : -v
Argument 2 : var=VAR

L'option -v n'a pas été prise en compte par awk.
Je peux donc la traiter dans mon script awk ainsi que son argument.
Il existe une fonction getopt pour gérer cela 8-)

Ça laisse toute liberté sur le choix et la gestion des options/arguments de la ligne de commande appelant le script awk.

Autre solution

Une autre solution consiste à utiliser l'indicateur de fin d'options (2 tirets).
Ainsi en gardant le shebang habituel avec -f, il est possible de passer des options et à awk et au script.
Un truc du genre :

./script_awk  options_awk_ici  --  options_script_ici  arguments …




Vli, vlà, vlou pour la petite astuce :-)