Difference between revisions of "HelloBash Ep3"

From Tmplab
(Qualités et concepts inhérents aux scripts)
(Gestion des arguments et des options)
Line 48: Line 48:
  
 
   cat ./myscript.sh  
 
   cat ./myscript.sh  
  #!/bin/bash
+
  #!/bin/bash
  echo "My name is $0"
+
  echo "My name is $0"
  echo "My first argument is $1"
+
  echo "My first argument is $1"
 +
 
 
   ./myscript.sh foo
 
   ./myscript.sh foo
  
On voit donc que la commande est stockée dans la variable $0 et le premier argument dans $1.
+
On voit donc que la commande est stockée dans la variable <code>$0</code> et le premier argument dans <code>$1</code>.
  
 
Bash ne sait pas nativement reconnaître des options, le script ne voit que des arguments les uns derrière les autres, accessibles dans des variables numérotées.
 
Bash ne sait pas nativement reconnaître des options, le script ne voit que des arguments les uns derrière les autres, accessibles dans des variables numérotées.
  
Une variable spéciale
+
Une variable spéciale <code>$@</code> contient tous les arguments passés à la commande, donc de <code>$1</code> à <code>$9</code>.
 +
 
  
 
   cat ./myscript.sh  
 
   cat ./myscript.sh  
  #!/bin/bash
+
  #!/bin/bash
  echo  "Arg1: $1 - Arg2: $2 - Arg3: $3 - Arg4: $4 - Arg5: $5 "
+
  echo  "Arg1: $1 - Arg2: $2 - Arg3: $3 - Arg4: $4 - Arg5: $5 "
  echo "All:  $@ "
+
  echo "All:  $@ "
  ./myscript.sh Epstein did not kill himself  
+
 
 +
  ./myscript.sh Epstein did not kill himself  
 +
 
  
 
Pour utiliser des options une ligne de commande plus riche on utilise la commande getopts (voir plus loin).
 
Pour utiliser des options une ligne de commande plus riche on utilise la commande getopts (voir plus loin).
Line 69: Line 73:
 
C'est la première manière de fournir des entrées utilisateurs : passer des arguments à la ligne de commande pour moduler le fonctionnement du script.  
 
C'est la première manière de fournir des entrées utilisateurs : passer des arguments à la ligne de commande pour moduler le fonctionnement du script.  
  
   cat ./nocomment.sh  
+
   # cat ./nocomment.sh  
 
   #!/bin/bash
 
   #!/bin/bash
 
   grep -Ev '^\s*([;#].*)?$' $@
 
   grep -Ev '^\s*([;#].*)?$' $@
   ./nocomment.sh /etc/adduser.conf
+
 
 +
   # ./nocomment.sh /etc/adduser.conf
  
 
== Déclarer des variables  ==
 
== Déclarer des variables  ==
 
== Faire des tests conditionnels ==
 
== Faire des tests conditionnels ==
 
En cours de rédaction...
 
En cours de rédaction...

Revision as of 07:55, 13 November 2019

Retour à la liste des épisodes

Ecrire et exécuter des scripts

Un premier script

echo "#!/bin/bash" > /tmp/myscript.sh
echo "echo helloBash" >> /tmp/myscript.sh
cat /tmp/myscript.sh | bash

L'entête #! ("Shebang" ou "Crunchbang") indique quel est l'interpréteur à utiliser (ici Bash, mais on pourrait en utiliser d'autre)

L'extension .sh est une convention pour les scripts shell en général.

On voit qu'on peut utiliser le contenu brut du script comme STDIN de bash pour l'exécuter.

Exécuter un script

Pour l'exécuter il faut ajouter le droit d'exécution sur le fichier

chmod 755 /tmp/myscript.sh
bash -c /tmp/myscript.sh
/tmp/myscript.sh

Qualités et concepts inhérents aux scripts

Toutes les commandes disponibles interactivement sont ajoutables dans un script.

Un script doit :

  • être réutilisable - automatiquement (cron) ou avec des entrées utilisateurs différentes
  • ne faire que le nécessaire - usage des structures logiques et des tests
  • être programmé de manière logique et compréhensible - une structure claire et lisible
  • s'exécuter sans erreurs - détection des échecs et abandon éventuel


Les concepts suivants sont à maîtriser pour rédiger de bons scripts :

  • Les entrées utilisateurs
  • Les branches conditionnelles
  • Les boucles
  • La structure logique
  • Le contrôle des statuts de sortie

Gestion des arguments et des options

Avant d'aborder les concepts essentiels, petit détour par la gestion des éléments envoyés au script depuis la ligne de commande. Un exemple.

 cat ./myscript.sh 
 #!/bin/bash
 echo "My name is $0"
 echo "My first argument is $1"
  ./myscript.sh foo

On voit donc que la commande est stockée dans la variable $0 et le premier argument dans $1.

Bash ne sait pas nativement reconnaître des options, le script ne voit que des arguments les uns derrière les autres, accessibles dans des variables numérotées.

Une variable spéciale $@ contient tous les arguments passés à la commande, donc de $1 à $9.


 cat ./myscript.sh 
 #!/bin/bash
 echo  "Arg1: $1 - Arg2: $2 - Arg3: $3 - Arg4: $4 - Arg5: $5 "
 echo "All:  $@ "
 ./myscript.sh Epstein did not kill himself 


Pour utiliser des options une ligne de commande plus riche on utilise la commande getopts (voir plus loin).

C'est la première manière de fournir des entrées utilisateurs : passer des arguments à la ligne de commande pour moduler le fonctionnement du script.

 # cat ./nocomment.sh 
  #!/bin/bash
 grep -Ev '^\s*([;#].*)?$' $@
 # ./nocomment.sh /etc/adduser.conf

Déclarer des variables

Faire des tests conditionnels

En cours de rédaction...