Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tutoriel:script_shell [Le 07/10/2019, 12:13]
BugFollower [Les variables]
tutoriel:script_shell [Le 05/10/2020, 15:23] (Version actuelle)
bcag2 ajout §[L'arithmétique]
Ligne 53: Ligne 53:
  
 Il suffit de se placer dans le dossier où est le script, et de lancer : <​code>​bash nom_du_script</​code>​ Il suffit de se placer dans le dossier où est le script, et de lancer : <​code>​bash nom_du_script</​code>​
-mais pas toujours bash ( dépend du language ​du script )+mais pas toujours bash ( dépend du langage ​du script )
  
 ou si vous voulez l'​exécuter par son  nom , il faut le rendre exécutable avec ''​chmod''​. Pour ceci tapez la commande qui suit : <​code>​chmod +x nom_du_script</​code>​ ou si vous voulez l'​exécuter par son  nom , il faut le rendre exécutable avec ''​chmod''​. Pour ceci tapez la commande qui suit : <​code>​chmod +x nom_du_script</​code>​
Ligne 93: Ligne 93:
  
   * [[wpfr>​Debian_Almquist_shell|dash]] (//Debian Almquist shell//) : shell plus léger que bash, installé par défaut sur Ubuntu ;   * [[wpfr>​Debian_Almquist_shell|dash]] (//Debian Almquist shell//) : shell plus léger que bash, installé par défaut sur Ubuntu ;
-  * bash (//Bourne Again SHell//) : conçu par le projet GNU, shell linux ; le shell par défaut sur Ubuntu ;+  * [[:bash]] (//Bourne Again SHell//) : conçu par le projet GNU, shell linux ; le shell par défaut sur Ubuntu ;
   * rbash : un shell restreint basé sur bash. Il existe de nombreuses variantes de bash ;   * rbash : un shell restreint basé sur bash. Il existe de nombreuses variantes de bash ;
   * csh, tcsh : shells C, créés par Bill Joy de Berkeley ;   * csh, tcsh : shells C, créés par Bill Joy de Berkeley ;
Ligne 260: Ligne 260:
 </​code>​ </​code>​
  
 +==== L'​arithmétique ====
 +<code bash>(( variable = 2 + $autre_var * 5 ))</​code>​
 +Exemple: besoin de définir des plages de valeurs (1 à 500 puis 501 à 1000 puis 1001 à 1500…)
 +<code bash>
 +id_per_step = 500
 +for (( i=0; i<8; i++ )); do
 + (( min_step_id = 1 + $i * $id_per_step ))
 + (( max_step_id = (( $i + 1 )) * $id_per_step ))
 + echo "​$min_step_id to $max_step_id "
 +done
 +</​code>​
 ===== Vocabulaire ===== ===== Vocabulaire =====
 ==== La commande test ==== ==== La commande test ====
Ligne 267: Ligne 278:
 En mode console, faites [[http://​www.bash-linux.com/​unix-man-test-francais.html| man test ]] pour connaître tous les opérateurs,​ en voici quelques-uns : En mode console, faites [[http://​www.bash-linux.com/​unix-man-test-francais.html| man test ]] pour connaître tous les opérateurs,​ en voici quelques-uns :
  
-=== Opérateurs de test ===+=== Opérateurs de test sur fichiers ​===
  
 ^ Syntaxe ^ Fonction réalisée ^ ^ Syntaxe ^ Fonction réalisée ^
Ligne 276: Ligne 287:
 | -x fichier ​     | renvoie 0 si fichier existe et est exécutable. ​        | | -x fichier ​     | renvoie 0 si fichier existe et est exécutable. ​        |
 | f1 -nt f2       | renvoie 0 si f1 est plus récent que f2.                | | f1 -nt f2       | renvoie 0 si f1 est plus récent que f2.                |
-| f1 -ot f2       | renvoie ​ 0 si f1 est plus vieux que f2.                 |+| f1 -ot f2       | renvoie 0 si f1 est plus vieux que f2.                 |
  
-=== Opérateurs de comparaison ​numériques ​===+=== Opérateurs de comparaison ​numérique ​===
  
 ^ Syntaxe ^ Fonction réalisée ^ ^ Syntaxe ^ Fonction réalisée ^
-| $A -lt 5         | renvoie ​ 0 si $A est strictement inférieur à 5 |+| $A -lt 5         | renvoie 0 si $A est strictement inférieur à 5 |
 | $A -le 5         | renvoie 0 si $A est inférieur ou égal à 5 | | $A -le 5         | renvoie 0 si $A est inférieur ou égal à 5 |
-| $A -gt 5         | renvoie ​ 0 si $A est strictement supérieur à 5 |+| $A -gt 5         | renvoie 0 si $A est strictement supérieur à 5 |
 | $A -ge 5         | renvoie 0 si $A est supérieur ou égal à 5 | | $A -ge 5         | renvoie 0 si $A est supérieur ou égal à 5 |
-| $A -eq 5         | renvoie ​ 0 si $A est égal à 5 |+| $A -eq 5         | renvoie 0 si $A est égal à 5 |
 | $A -ne 5         | renvoie 0 si $A est différent de 5 | | $A -ne 5         | renvoie 0 si $A est différent de 5 |
  
Ligne 300: Ligne 311:
 0 0
 </​code>​ </​code>​
-Affichera la valeur 0 : ce fichier existe, 1 dans le cas où le fichier /etc/passwd n'​existe pas. Sous unix, le code de retour est par convention et en général 0 s'il n'y a aucune erreur et différent de 0 dans les autres cas+Affichera la valeur 0 : ce fichier existe, 1 dans le cas où le fichier /etc/passwd n'​existe pas. Sous Unix, le code de retour est par convention et en général 0 s'il n'y a aucune erreur et différent de 0 dans les autres cas.
  
 La syntaxe la plus appropriée dans de la programmation shell moderne est le double crochet : La syntaxe la plus appropriée dans de la programmation shell moderne est le double crochet :
 <code bash>[[ -f /etc/passwd ]]</​code>​ <code bash>[[ -f /etc/passwd ]]</​code>​
-Cela gère bien mieux les problèmes d'espace ​dans les noms de fichiers, les erreurs etc... C'est une structure <​del>​propre à</​del>​ bash (ksh, ?) qui est le shell par défaut dans la plupart des distributions Linux, et de Ubuntu en particulier. On garde en général des simples crochets pour les scripts shell qui doivent être à tout prix POSIXUtilisation ​sur des Unix sans installation ​préalables ​de bash, comme BSD, Solaris... )+Cela gère bien mieux les problèmes d'espaces ​dans les noms de fichiers, les erreurs etc... C'est une structure <​del>​propre à</​del>​ bash (ksh, ?) qui est le shell par défaut dans la plupart des distributions Linux, et de Ubuntu en particulier. On garde en général des simples crochets pour les scripts shell qui doivent être à tout prix POSIX ( utilisation ​sur des Unix sans installation ​préalable ​de bash, comme BSD, Solaris... ) .
  
 === Les opérateurs logiques === === Les opérateurs logiques ===
Ligne 518: Ligne 529:
 #!/bin/sh #!/bin/sh
   ​   ​
-echo -n "Etes-vous fatigué ? "+echo -n "Êtes-vous fatigué ? "
 read on read on
   ​   ​
Ligne 567: Ligne 578:
 case $reps in case $reps in
   help | hlp )   help | hlp )
-     echo "propos de TS --> about"+     echo "À propos de TS --> about"
      echo "ls --> liste les fichiers"​      echo "ls --> liste les fichiers"​
      echo "rm --> détruit un fichier (guidé)"​      echo "rm --> détruit un fichier (guidé)"​
Ligne 614: Ligne 625:
 </​code>​ </​code>​
  
-Comme vous l'​aurez sans doute remarqué, on assigne une valeur différente à //​variable//​ à chaque itération. On peut aussi très facilement utiliser des fichiers comme "​valeur"​. Rien ne vaut un exemple :+ou le classique:​ 
 +<code bash> 
 +for (( i=$min; i<=$max; i++ )); do 
 +    instructions_avec_i # ou pas 
 +done 
 +</​code>​ 
 + 
 +Comme vous l'​aurez sans doute remarqué, on assigne une valeur différente à //​variable//​ à chaque itération. On peut aussi très facilement utiliser des fichiers comme "​valeur"​.\\ 
 +Rien ne vaut un exemple :
 <code bash> <code bash>
 #!/bin/sh #!/bin/sh
Ligne 622: Ligne 641:
 </​code>​ </​code>​
  
-On peut voir une syntaxe un peu particulière : <code bash>​$(sort *.txt)</​code>​Ceci sert à +On peut voir une syntaxe un peu particulière : 
-indiquer que ce qui est entre les parenthèses est une commande à exécuter.+<code bash>​$(sort *.txt)</​code>​ 
 +Ceci sert à indiquer que ce qui est entre les parenthèses est une commande à exécuter.
  
-On peut aussi utiliser ​ +On peut aussi utiliser cette instruction simplement avec des nombres, cela permet de connaître le nombre d'​itérations :
-cette instruction simplement avec des nombres, cela permet de connaître le nombre d'​itérations :+
 <code bash> <code bash>
 #!/bin/sh #!/bin/sh
Ligne 634: Ligne 653:
 </​code>​ </​code>​
  
-On peut très bien aussi utiliser d'​autres types de variables, comme par exemple des chaînes de  +On peut très bien aussi utiliser d'​autres types de variables, comme par exemple des chaînes de caractères :
-caractères :+
 <code bash> <code bash>
 #!/bin/sh #!/bin/sh
Ligne 676: Ligne 694:
 Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n'​importe quoi à une fonction. ​ Comme vous l'avez sans doute remarqué, quand on appelle la fonction, on exécute simplement ce qu'on lui a défini au début, dans notre exemple, echo... et ls -l, on peut donc faire exécuter n'​importe quoi à une fonction. ​
  
-Les fonctions peuvent être définies n'​importe ​ou dans le code du moment qu'​elle sont définies avant d'​être utilisées. Même si en bash les variables sont globales, il est possible de les déclarer comme locales au sein d'un fonction en la précédant du mot clé local: local ma_fonction+Les fonctions peuvent être définies n'​importe ​où dans le code du moment qu'​elle sont définies avant d'​être utilisées. Même si en bash les variables sont globales, il est possible de les déclarer comme locales au sein d'un fonction en la précédant du mot clé local: local ma_fonction ​.
  
-Exemple: ​Un sleep interactif.+Exemple: ​un sleep interactif ​:
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
Ligne 701: Ligne 719:
  
  
-==== Extraire des sous chaines ​====+==== Extraire des sous-chaînes ​====
  
-Pour extraire une chaine ​d'​une ​chaine ​on utilise : **${ ''​chaine''​ : ''​position''​ : ''​nombre de caractères''​ }** (n'​oubliez pas le **:** qui sépare les "​paramètres"​).+Pour extraire une chaîne ​d'​une ​chaîne ​on utilise : **${ ''​chaîne''​ : ''​position''​ : ''​nombre de caractères''​ }** (n'​oubliez pas le **:** qui sépare les "​paramètres"​).
  
-<note important>​Dans la partie ''​chaine''​ pour faire référence à une variables ​**on ne met pas de $** ! Tandis que dans les autres options le $ est nécessaire (sauf si vous n'​utilisez pas de variable). Il y a de quoi s’emmêler les pinceaux. Si vous n'avez pas compris (ce n'est pas étonnant), les exemples de cette partie vous aideront beaucoup.</​note>​+<note important>​Dans la partie ''​chaîne''​ pour faire référence à une variable ​**on ne met pas de $** ! Tandis que dans les autres options le $ est nécessaire (sauf si vous n'​utilisez pas de variable). Il y a de quoi s’emmêler les pinceaux. Si vous n'avez pas compris (ce n'est pas étonnant), les exemples de cette partie vous aideront beaucoup.</​note>​
  
-Par exemple pour savoir ce que l'on aime manger en fonction de sa langue (vous êtes alors vraiment ultra geek 8-O !)+Par exemple pour savoir ce que l'on aime manger en fonction de sa langue (vous êtes alors vraiment ultra geek 8-O !) :
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
Ligne 722: Ligne 740:
 #Noter que $LANG n'a pas le préfixe '​$'​. ${$LANG:​0:​2} ne fonctionne pas ! #Noter que $LANG n'a pas le préfixe '​$'​. ${$LANG:​0:​2} ne fonctionne pas !
 </​code>​ </​code>​
-puis+puis :
 <​code>​ <​code>​
 $ ./​favoritefood $ ./​favoritefood
Ligne 733: Ligne 751:
 :'-( :'-(
 </​code>​ </​code>​
-Ce code illustre un moyen de faire des scripts multilingues+Ce code illustre un moyen de faire des scripts multilingues ​.
  
-Une variante permet de tronquer uniquement le début de la chaine. C'est **${ ''​chaine''​ : ''​nombre de caractères''​}**  +Une variante permet de tronquer uniquement le début de la chaîne. C'est **${ ''​chaîne''​ : ''​nombre de caractères''​}** ​.\\ 
-Le tout peut s'​illustrer par un (vraiment) petit exemple+Le tout peut s'​illustrer par un (vraiment) petit exemple ​:
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
-#truncbegin <chaine> <​nombre>​+#truncbegin <chaîne> <​nombre>​
 echo ${1:$2} echo ${1:$2}
 #Noter bien que echo ${1:2} tronquerait les 2 premiers caractères (et non le nombre indiqué par le 2e paramètre). #Noter bien que echo ${1:2} tronquerait les 2 premiers caractères (et non le nombre indiqué par le 2e paramètre).
 </​code>​ </​code>​
-puis +puis :
 <​code>​ <​code>​
 $ ./​truncbegin "Hello world !" 5 $ ./​truncbegin "Hello world !" 5
Ligne 759: Ligne 777:
 echo -e '​\033[A;​B;​Cm toto \033[0m'​ echo -e '​\033[A;​B;​Cm toto \033[0m'​
 </​code>​ </​code>​
-Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présentsA, B et C.+Dans la commande passée ci-dessus, nous pouvons constater qu’il y a 3 paramètres présentsA, B et C.\\
 A : correspond à un effet affecté au texte affiché A : correspond à un effet affecté au texte affiché
 B : correspond à la couleur du texte B : correspond à la couleur du texte
Ligne 768: Ligne 786:
 === Présentation des différentes valeurs Effet === === Présentation des différentes valeurs Effet ===
  
-Nous allons commencer par les différents effets ​possible ​:+Nous allons commencer par les différents effets ​possibles ​:
  
 ^Code^Effet^ ^Code^Effet^
Ligne 791: Ligne 809:
 === Présentation des différentes valeurs des couleurs === === Présentation des différentes valeurs des couleurs ===
  
-Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs. Chaque couleur ​à 2 valeurs,la première utilisée pour la couleur du texte, et la seconde pour la couleur du fond.+Maintenant que nous avons présenté les différents effets possibles d’attribuer à du texte, nous allons nous attaquer aux couleurs.\\ 
 +Chaque couleur ​2 valeurs, la première utilisée pour la couleur du texte, et la seconde pour la couleur du fond.
 ^Couleur^Couleur texte^Couleur fond^ ^Couleur^Couleur texte^Couleur fond^
 |Noir|30|40| |Noir|30|40|
Ligne 813: Ligne 832:
 [[http://​abs.traduc.org/​abs-5.3-fr/​apm.html|Guide avancé d'​écriture des scripts Bash - Une exploration en profondeur de l'art de la programmation shell]] [[http://​abs.traduc.org/​abs-5.3-fr/​apm.html|Guide avancé d'​écriture des scripts Bash - Une exploration en profondeur de l'art de la programmation shell]]
  
-Aux structures décrites ci-dessus, il est nécessaire,​ pour réaliser des scripts poussés, de connaître les commandes shell les plus usitées.\\ Vous en trouverez une présentation sur cette autre page du wiki : [[projets:​ecole:​scripting:​initiation_au_shell]]+Aux structures décrites ci-dessus, il est nécessaire,​ pour réaliser des scripts poussés, de connaître les commandes shell les plus usitées.\\ Vous en trouverez une présentation sur cette autre page du wiki : [[projets:​ecole:​scripting:​initiation_au_shell]] ​.
  
 La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**.\\ ​ La programmation de script shell étant ouverte à tous, cela permet de bénéficier de nombreux scripts pour des applications très variées ; cependant, **la plupart sont proposés sans aucune garantie**.\\ ​
-Vous pourrez trouver une liste de scripts pouvant servir d'exemple ​sur la page [[:​scripts_utiles|scripts utiles]] du wiki.+Vous pourrez trouver une liste de scripts pouvant servir d'exemples ​sur la page [[:​scripts_utiles|scripts utiles]] du wiki.
  
 Une fois vos armes faites, proposez vos contributions sur le topic du forum [[http://​forum.ubuntu-fr.org/​viewtopic.php?​id=204074|[VOS SCRIPTS UTILES]]] et rajoutez un lien dans la page du wiki ci-dessus. Une fois vos armes faites, proposez vos contributions sur le topic du forum [[http://​forum.ubuntu-fr.org/​viewtopic.php?​id=204074|[VOS SCRIPTS UTILES]]] et rajoutez un lien dans la page du wiki ci-dessus.
Ligne 836: Ligne 855:
 } }
 </​code>​ </​code>​
-  * Utiliser des chemins ​absolu ​pour les dossiers et des chemins ​relatif ​pour les nom de fichiers <code bash>​$CHEMIN_DU_DOSSIER/​$NOM_DU_FICHIER</​code>​+  * Utiliser des chemins ​absolus ​pour les dossiers et des chemins ​relatifs ​pour les noms de fichiers ​<code bash>​$CHEMIN_DU_DOSSIER/​$NOM_DU_FICHIER</​code>​
   * Utiliser les entrées de commandes pour les fonctions :<code bash>​nom_de_la_fonction $1 $2 $3 ....</​code>​   * Utiliser les entrées de commandes pour les fonctions :<code bash>​nom_de_la_fonction $1 $2 $3 ....</​code>​
-  * Si votre script doit s'​arrêter à cause d'une erreur, d'une variable qui ne correspond pas vos attentes utiliser des numéros exit différents : <code bash>​exit 100;+  * Si votre script doit s'​arrêter à cause d'une erreur, d'une variable qui ne correspond pas à vos attentes utiliser des numéros exit différents : <code bash>​exit 100;
 exit 101; exit 101;
 exit 102; exit 102;
Ligne 856: Ligne 875:
 }</​code>​ainsi après chaque commande vous pouvez donner des codes d'​exécutions différents. }</​code>​ainsi après chaque commande vous pouvez donner des codes d'​exécutions différents.
  
-<note tip>​Astuce : Le plus important dans tout programme est l'​algorithme utilisé</​note>​+<note tip>​Astuce : le plus important dans tout programme est l'​algorithme utilisé.</​note>​
 Exemple : Exemple :
-Supposons ​que vous ayez une base de données, avec 3 catégories d'​enregistrements possibles :+supposons ​que vous ayez une base de données, avec 3 catégories d'​enregistrements possibles :
 éléphant bleu, éléphant blanc, éléphant rose ayant chacun 30 individus. éléphant bleu, éléphant blanc, éléphant rose ayant chacun 30 individus.
 Votre script doit compter le nombre d'​éléphants bleus et blancs. Votre script doit compter le nombre d'​éléphants bleus et blancs.
Ligne 868: Ligne 887:
 Quel algorithme choisissez-vous ? Quel algorithme choisissez-vous ?
  
-Résultat : Le premier car dans le deuxième il faut d'​abord calculer le nombre total d'​éléphants,​ donc un calcul en plus :-P+Résultat : le premier car dans le deuxième il faut d'​abord calculer le nombre total d'​éléphants,​ donc un calcul en plus :-P .
  
 ===== Liens ===== ===== Liens =====
  • tutoriel/script_shell.1570443205.txt.gz
  • Dernière modification: Le 07/10/2019, 12:13
  • par BugFollower