User Tools

Site Tools


informatique:linux:programmation_shell

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
informatique:linux:programmation_shell [2019/04/24 11:36]
pteu [Descripteurs de fichier]
informatique:linux:programmation_shell [2020/04/29 11:45] (current)
pteu [Variables spécifiques] $-
Line 1: Line 1:
  
-====== Programmation Shell =======+======Programmation Shell=======
  
-Les différents shells peuvent avoir des fonctions sensiblement différentes voir incompatibles. Ce n'est pas le cas pour la majorité d'​entre elles. Ici nous parlerons de [[https://fr.wikipedia.org/​wiki/​Bourne-Again_shell|bash]] car c'est le plus couramment utilisé. Pour afficher la liste des options de bash il faut saisir ''​bash -c "help set"''​. Pour lire un script sans exécuter les commandes : ''​bash -n''​.+{{ :informatique:​linux:​bash_logo.png?300|}}
  
 +Les différents shells peuvent avoir des fonctions sensiblement différentes voir incompatibles. Ce n'est pas le cas pour la majorité d'​entre elles. Ici nous parlerons de [[https://​fr.wikipedia.org/​wiki/​Bourne-Again_shell|bash]] car c'est le plus couramment utilisé.
 +
 +Pour afficher la liste des options de bash il faut saisir ''​bash -c "help set"''​. Pour lire un script sans exécuter les commandes : ''​bash -n''​.
  
   * ''​. <​CONFIG_FILE>''​ => permet de faire un //include// (notez bien le point + espace ". ")   * ''​. <​CONFIG_FILE>''​ => permet de faire un //include// (notez bien le point + espace ". ")
-  * ''​!!''​ => est remplacé par la dernière commande (différent de ''​$_''​ qui contient ​uniquement le dernier paramètre de la dernière commande)+  * ''​!!''​ => est remplacé par la dernière commande (différent de ''​$_''​ qui désigne ​uniquement le dernier paramètre de la dernière commande)
 <code bash> <code bash>
 $ touch toto $ touch toto
Line 59: Line 62:
 echo ${VAR:​=defaut} ​   # defaut (VAR prend également cette valeur) echo ${VAR:​=defaut} ​   # defaut (VAR prend également cette valeur)
 </​code>​ </​code>​
 +
 +=====Typage=====
 +
 +Il n'y a pas de typage strict en bash, toutes les variables sont considérées comme des chaînes de caractères,​ sur lesquelles on peut toutefois réaliser des opérations arithmétiques par exemple, si elles ne contiennent que des chiffres.
 +
 +Pour "​émuler"​ une variable booléenne par exemple, il convient de tester son contenu puisque c'est en réalité une string :
 +<code bash>
 +is_ready=true ​  # is_ready est une string qui vaut "​true"​
 +if [ "​$is_ready"​ = true ]
 +   then echo "​I'​m ready"
 +   else echo "​I'​m not"
 +fi
 +</​code>​
 +
 +Pour plus de détails sur le pseudo-typage en bash, voir la fonction [[informatique:​linux:​commandes_linux#​declare|declare]].
  
 ===== Manipulation des variables===== ===== Manipulation des variables=====
Line 109: Line 127:
   * ''​$!''​ renvoie le PID de la dernière commande   * ''​$!''​ renvoie le PID de la dernière commande
   * ''​$?''​ renvoie le retour (code d'​erreur par exemple) de la dernière commande   * ''​$?''​ renvoie le retour (code d'​erreur par exemple) de la dernière commande
 +  * ''​$-''​ renvoie la liste des paramètres courts du shell. Pour les interpréter,​ saisir ''​help set''​ dans le shell.
  
   * ''​IFS="​\n"''​ (Internal Field Separator) le séparateur de champ est "​ENTER"​ (utilisée par la commande read)   * ''​IFS="​\n"''​ (Internal Field Separator) le séparateur de champ est "​ENTER"​ (utilisée par la commande read)
   * ''​$PWD''​ renvoie le chemin du shell depuis lequel est lancé le script (équivalent à pwd) ; c'est complémentaire de ''​$0''​   * ''​$PWD''​ renvoie le chemin du shell depuis lequel est lancé le script (équivalent à pwd) ; c'est complémentaire de ''​$0''​
- 
  
  
Line 137: Line 155:
 trois trois
 </​code>​ </​code>​
 +
 +Exemple de découpage d'une chaîne dans un tableau, avec comme séparateur ";"​ :
 +<code bash>
 +CHAINE='​17;​8 23;9'
 +IFS=";" ​                      # définition du séparateur
 +read -a TAB <<<"​$CHAINE"​
 +echo "​${#​TAB[@]}" ​             # affiche de la taille du tableau (nombre de cellule)
 + 3
 +printf '​%s\n'​ "​${TAB[@]}" ​     # affichage du contenu du tableau cellule par cellule
 + 17
 + 8 23
 + 9
 +</​code>​
 +
 ====Tableau à 2 dimensions==== ====Tableau à 2 dimensions====
  
-Ça n'eût pas existé ​pas sous bash :). Mais on peut l'​émuler en créant un tableau associatif (qui, à une clé fait correspondre un contenu), en codant la clé pour émuler 2 dimensions. Exemple : pour émuler un tableau de 2 x 3 cases :+Ça n'eût pas existé sous bash :). Mais on peut l'​émuler en créant un tableau associatif (qui, à une clé fait correspondre un contenu), en codant la clé pour émuler 2 dimensions. Exemple : pour émuler un tableau de 2 x 3 cases :
 <code bash> <code bash>
 # déclaration d'un tableau associatif T # déclaration d'un tableau associatif T
Line 161: Line 193:
 </​code>​ </​code>​
  
 +====Tableau associatif====
 +
 +Créer et utiliser un vrai tableau associatif :
 +<code bash>
 +declare -A TA=([cle1]=valeur1 ["cle 2"​]="​valeur 2" [cle3]=valeur3)
 +echo "​${TA[cle1]}"​
 +# valeur1
 +
 +# Parcourir le tableau
 +for cle in "​${!TA[@]}";​ do
 +   echo "​cle=$cle ; val=${TA[$cle]}"​
 +done
 +#cle=cle 2 ; val=valeur 2
 +#cle=cle3 ; val=valeur3
 +#cle=cle1 ; val=valeur1
 +</​code>​
  
 +Pour connaitre la taille de ce tableau : ''​${#​TA[@]}''​ (3 dans cet exemple).
 =====getopts : analyse des arguments d'un script===== =====getopts : analyse des arguments d'un script=====
  
Line 481: Line 530:
   * ''​n1 -le n2''​ plus petit ou égal   * ''​n1 -le n2''​ plus petit ou égal
  
 +Comme il n'y a pas de typage en bash, pour tester si la valeur d'une variable est un nombre (entier) il faut réaliser le tester :
 +<code bash>
 +# Solution à base de REGEX
 +[[ $VAR =~ ^[0-9]+$ ]] || echo "VAR n'est pas un entier"​
 +# NB : l'​expression régulière ne doit pas être quotée,
 +#      ou doit être enregistrée dans une variable sinon ça ne matche pas
 +
 +# "​auto-test"​ numérique :)
 +[ $VAR -eq $VAR ] 2>/​dev/​null || echo "VAR n'est pas un entier"​
 +</​code>​
 ==== Opérateurs ==== ==== Opérateurs ====
   * ''​!''​ unaire de négation   * ''​!''​ unaire de négation
informatique/linux/programmation_shell.1556098605.txt.gz · Last modified: 2019/04/24 11:36 by pteu