informatique:linux:programmation_shell
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
informatique:linux:programmation_shell [2018/12/06 15:24] – [read] process substitution pteu | informatique:linux:programmation_shell [2020/01/14 14:58] – [Tableau associatif] pteu | ||
---|---|---|---|
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' | + | {{ :informatique: |
+ | Les différents shells peuvent avoir des fonctions sensiblement différentes voir incompatibles. Ce n'est pas le cas pour la majorité d' | ||
+ | |||
+ | Pour afficher la liste des options de bash il faut saisir '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
<code bash> | <code bash> | ||
$ touch toto | $ touch toto | ||
Line 59: | Line 62: | ||
echo ${VAR: | echo ${VAR: | ||
</ | </ | ||
+ | |||
+ | =====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, | ||
+ | |||
+ | Pour " | ||
+ | <code bash> | ||
+ | is_ready=true | ||
+ | if [ " | ||
+ | then echo " | ||
+ | else echo " | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | Pour plus de détails sur le pseudo-typage en bash, voir la fonction [[informatique: | ||
===== Manipulation des variables===== | ===== Manipulation des variables===== | ||
Line 112: | Line 130: | ||
* '' | * '' | ||
* '' | * '' | ||
- | |||
Line 123: | Line 140: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
Comme pour les variables classiques, on peut récupérer la longueur en le précèdent de ''#'' | Comme pour les variables classiques, on peut récupérer la longueur en le précèdent de ''#'' | ||
* longueur de la 3e case : '' | * longueur de la 3e case : '' | ||
* taille du tableau (nombre de case de celui-ci) : '' | * taille du tableau (nombre de case de celui-ci) : '' | ||
+ | |||
+ | Pour parcourir facilement un tableau dans une boucle : | ||
+ | <code bash> | ||
+ | ARRAY=( un deux trois ) | ||
+ | for i in " | ||
+ | un | ||
+ | deux | ||
+ | trois | ||
+ | </ | ||
+ | |||
+ | Exemple de découpage d'une chaîne dans un tableau, avec comme séparateur ";" | ||
+ | <code bash> | ||
+ | CHAINE=' | ||
+ | IFS=";" | ||
+ | read -a TAB <<<" | ||
+ | echo " | ||
+ | 3 | ||
+ | printf ' | ||
+ | 17 | ||
+ | 8 23 | ||
+ | 9 | ||
+ | </ | ||
====Tableau à 2 dimensions==== | ====Tableau à 2 dimensions==== | ||
- | Cela n'existe | + | Ça n'eût pas existé |
<code bash> | <code bash> | ||
# déclaration d'un tableau associatif T | # déclaration d'un tableau associatif T | ||
Line 153: | Line 192: | ||
</ | </ | ||
+ | ====Tableau associatif==== | ||
+ | |||
+ | Créer et utiliser un vrai tableau associatif : | ||
+ | <code bash> | ||
+ | declare -A TA=([cle1]=valeur1 ["cle 2" | ||
+ | echo " | ||
+ | # valeur1 | ||
+ | |||
+ | # Parcourir le tableau | ||
+ | for cle in " | ||
+ | echo " | ||
+ | done | ||
+ | #cle=cle 2 ; val=valeur 2 | ||
+ | #cle=cle3 ; val=valeur3 | ||
+ | #cle=cle1 ; val=valeur1 | ||
+ | </ | ||
+ | Pour connaitre la taille de ce tableau : '' | ||
=====getopts : analyse des arguments d'un script===== | =====getopts : analyse des arguments d'un script===== | ||
Line 232: | Line 288: | ||
</ | </ | ||
+ | |||
+ | ======Descripteurs de fichier====== | ||
+ | |||
+ | Il existe 3 descripteurs de fichier standards, utilisés par toutes les commandes : 0, 1 et 2 correspondants à STDIN, STDOUT et STDERR (input, output et erreur). 0 pointe par défaut sur le clavier, 1 et 2 sont affichés par défaut à l' | ||
+ | |||
+ | Pour lire depuis un fichier plutôt que depuis le clavier : | ||
+ | <code bash> | ||
+ | echo toto > / | ||
+ | read VAR < / | ||
+ | echo $VAR | ||
+ | toto | ||
+ | </ | ||
+ | |||
+ | ====Les redirecteurs==== | ||
+ | |||
+ | * ''>'' | ||
+ | * ''< | ||
+ | * ''&> | ||
+ | * ''<'' | ||
+ | |||
+ | Ces redirecteurs sont restaurés à leur valeur par défaut à chaque nouvelle ligne ; en revanche tous les processus fils héritent des descripteurs de leur processus père, à moins que celui-ci ne les ferme (voir plus bas). | ||
+ | |||
+ | '' | ||
+ | |||
+ | Pour rediriger le flux d' | ||
+ | <code bash> | ||
+ | ./prog 2>/ | ||
+ | </ | ||
+ | |||
+ | Pour rediriger le flux d' | ||
+ | <code bash> | ||
+ | ./prog 2>&1 | ./ | ||
+ | # équivaut à | ||
+ | ./prog |& ./prog2 | ||
+ | # (depuis bash4, " | ||
+ | </ | ||
+ | |||
+ | |||
+ | Par défaut ''>'' | ||
+ | <code bash> | ||
+ | ./prog 2>>/ | ||
+ | </ | ||
+ | Ainsi on conserve les erreurs de chaque exécution du programme. | ||
+ | |||
+ | On peut utiliser les descripteurs 3 et plus également, en les initialisant pour ne pas générer d' | ||
+ | <code bash> | ||
+ | echo " | ||
+ | echo " | ||
+ | toto | ||
+ | </ | ||
+ | |||
+ | Pour fermer un descripteur de fichier (le 3 par ex) : '' | ||
+ | |||
+ | On peut faire pointer un descripteur vers un fichier du système : | ||
+ | <code bash> | ||
+ | exec 3<> / | ||
+ | echo toto >&3 | ||
+ | exec 3>& | ||
+ | </ | ||
+ | |||
+ | Exemple d' | ||
+ | <code bash> | ||
+ | # An application of this is writing at a specified place in a file. | ||
+ | echo 1234567890 > File # Write string to " | ||
+ | exec 3<> File # Open " | ||
+ | read -n 4 <& | ||
+ | echo -n . >& | ||
+ | exec 3>& | ||
+ | cat File # ==> 1234.67890 | ||
+ | </ | ||
======Les fonctions====== | ======Les fonctions====== | ||
+ | =====pipe (" | ||
+ | |||
+ | Le pipe (tube) est une fonction qui permet de chainer la sortie d'une première commande sur l' | ||
+ | <code bash> | ||
+ | echo "toto et tata" | awk ' | ||
+ | tata | ||
+ | </ | ||
+ | |||
+ | Le soucis c'est qu'on ne récupère que le code de retour de la dernière commande du pipe ; et dans l' | ||
+ | * récupérer les codes de retour de chaque commande dans le tableau '' | ||
+ | <code bash> | ||
+ | false | true | ||
+ | echo " | ||
+ | 1 0 | ||
+ | </ | ||
+ | * utiliser la variable '' | ||
+ | <code bash> | ||
+ | $ false | true; echo $? | ||
+ | 0 | ||
+ | $ set -o pipefail | ||
+ | $ false | true; echo $? | ||
+ | 1 | ||
+ | </ | ||
===== read ===== | ===== read ===== | ||
Line 243: | Line 392: | ||
Pour afficher un texte avant la saisie on utilise '' | Pour afficher un texte avant la saisie on utilise '' | ||
<code bash> | <code bash> | ||
- | read -p "Quel est le nombre indique sur votre CB ? Et le cryptogramme visuel de derrière ?" CARD_NUMBER CRYPTO | + | read -p "Quel est le numéro de ta CB ? Et le cryptogramme visuel de derrière ?" CARD_NUMBER CRYPTO |
</ | </ | ||
Line 250: | Line 399: | ||
read < fichier.txt | read < fichier.txt | ||
- | # souvent | + | # c'est plutôt |
- | # exemple | + | |
while read line; do | while read line; do | ||
echo $line | echo $line | ||
Line 268: | Line 416: | ||
done | done | ||
</ | </ | ||
- | Le premier exemple utilise une [[https:// | + | Le premier exemple utilise une [[https:// |
Pour lire depuis une variable : | Pour lire depuis une variable : | ||
Line 367: | Line 515: | ||
====Chaînes de caractères==== | ====Chaînes de caractères==== | ||
- | * '' | + | * '' |
- | * '' | + | * '' |
+ | * ''" | ||
* '' | * '' | ||
* '' | * '' | ||
Line 423: | Line 572: | ||
Affichera : '' | Affichera : '' | ||
- | Cela équivaut à : '' | + | Cela équivaut à : '' |
+ | <code bash> | ||
+ | DEBUT=1 | ||
+ | FIN=5 | ||
+ | for (( i = $DEBUT; i <= $FIN; i++ )) | ||
+ | |||
+ | # ne fonctionne pas : for i in {$DEBUT..$FIN} | ||
+ | </ | ||
On peut aussi lui fournir une liste de mots : | On peut aussi lui fournir une liste de mots : |
informatique/linux/programmation_shell.txt · Last modified: 2023/10/02 13:35 by pteu