À un certain moment dans votre carrière de bioinformaticien, vous aurez à écrire des scripts shell, c’est inévitable ! Alors discutons d’une stratégie qui vous permettra à la fois de rendre vos scripts ré-utilisables et de garder une trace des paramètres utilisés pour générer une série de résultats.

(Avertissement: les procédures décrites ci-bas ont été testées à l’aide du shell BASH, des modifications pourraient s’avérer nécessaires si vous utilisez un shell différent.)

Il existe plusieurs techniques pour passer des paramètres à vos scripts shell.

Variables shell numérotées

Une manière hyper simple consiste à utiliser les variables shell numérotées. Grosso modo, toute chaine de caractères ajoutée à la suite de votre appel de script devient disponible à l’intérieur de celui-ci par le biais des variables $1, $2, etc..

%> cat simple_script.sh
#!/bin/bash
echo "Salutation: ${1}"
echo "Cible: ${2}"

%> ./simple_script.sh hello world
Salutation: hello
Cible: world  

(Astuce: Bien que ce ne soit pas nécessaire, le fait d’envelopper vos noms de variable au sein d’accolades ({}) est une bonne pratique qui pourrait vous épargner des maux de tête plus tard.)

C’est pratique, mais ce n’est pas exactement le but recherché. De plus, le positionnement des arguments devient fixe alors on perd un peu de flexibilité.

Utilitaire getopts

La seconde option à laquelle nous sommes confrontés est généralement l’usage de l’utilitaire getopts.

%> cat getopts_script.sh
#!/bin/bash
while getopts s:c: option
do
  case "${option}"
  in
    s) SALUTATION=${OPTARG};;
    c) CIBLE=${OPTARG};;
  esac
done

echo "Salutation: ${GREETING}"
echo "Cible: ${TARGET}"

%> ./getopts_script.sh -s hello -c world
Salutation: hello
Cible: world  

Nous sommes maintenant libres de fournir les paramètres dans l’ordre de notre choix:

% ./getopts_script.sh -c world -s hello
Salutation: hello
Cible: world  

On se rapproche de notre but !
Mais avant de poursuivre, prenons quelques instants pour bien comprendre ce qui se passe.
Essentiellement, nous itérons au travers des paramètres passés lors de l’appel du script (la boucle while) et nous exécutons des blocs d’instructions en réaction à la présence des paramètres (à l’aide du bloc case).

Mettons tout ça ensemble

Utilisons ce que nous avons vu jusqu’ici afin de réaliser notre but d’obtenir un script ré-utilisable ainsi qu’une trace des paramètres utilisés lors de son exécution.

Considérons ce script freebayes.sh tout simple:

%> cat freebayes.sh
#!/bin/bash
${FREEBAYES_SOFT} -C ${COUVERTURE} -f ${GENOME} ${BAM} > ${PWD}/var.${COUVERTURE}X.vcf

Comme vous pouvez le constater, la valeur des paramètres suivants doit être fournie par l’utilisateur:

FREEBAYES_SOFT: l'exécutable Freebayes
COUVERTURE: la valeur du paramètre couverture de Freebayes
GENOME: l'emplacement du génome de référence
BAM: l'emplacement du fichier .bam contenant nos données SNG alignées

(Astuce: PWD est une variable BASH qui référence le répertoire courant)

Ajoutons un peu de code pour traiter les paramètres:

%> cat freebayes.sh
#!/bin/bash
while getopts c: option
do
  case "${option}"
  in
    c) source ${OPTARG};;
  esac
done

${FREEBAYES_SOFT} -C ${COUVERTURE} -f ${GENOME} ${BAM} > ${PWD}/var.${COUVERTURE}X.vcf

Mais attendez un instant, pourquoi s’attend-on à ne recevoir qu’un seul argument ? La réponse se trouve dans la commande source.
Je vous ai promis une trace des paramètres utilisés lors de l’exécution, non ?
Et bien, on peut maintenant atteindre notre but en spécifiant les valeurs des paramètres nécessaires à l’exécution de freebayes.sh au sein d’un second fichier (appelons-le freebayes_run.conf) de cette manière:

%> cat freebayes_run.conf
#!/bin/bash
FREEBAYES_SOFT=/soft/bioinfo/freebayes-1.2.0/bin/freebayes
COUVERTURE=5
GENOME=/soft/bioinfo/resources/genomes/GRCh38_88/genome/GRCh38.fa
BAM=~/mon_projet/alignments/mon_echantillon.bam

On peut maintenant storer notre script freebayes.sh ré-utilisable dans un répertoire général (tel que ~/mon_projet/lib/) et l’exécuter à partir d’un autre répertoire en précisant le fichier .conf à utiliser. Une bonne stratégie consiste à storer le fichier .conf au sein du répertoire de l’analyse.

%> ~/mon_projet/lib/freebayes.sh -c ./freebayes_run.conf

De cette façon, lorsque l’on voudra vérifier la version du binaire freebayes ou du génome de référence utilisé pour créer le jeux de données quelques mois ou années plus tard, nous n’aurons qu’à consulter le fichier .conf ! Travailler ainsi représente sûrement un effort supplémentaire , mais je crois que le jeu en vaut la chandelle.

Laissez-moi savoir ce que vous en pensez !