{"id":1407,"date":"2020-12-04T12:45:24","date_gmt":"2020-12-04T11:45:24","guid":{"rendered":"http:\/\/ve2cuy.com\/420-3c3\/?page_id=1407"},"modified":"2023-11-12T21:02:53","modified_gmt":"2023-11-12T20:02:53","slug":"les-scripts-sous-unix","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/420-3c3\/?page_id=1407","title":{"rendered":"Les scripts sous Unix"},"content":{"rendered":"<h2>Introduction aux scripts bash<\/h2>\n<p><span style=\"color: #ff0000;\"><strong>Attention<\/strong><\/span>: Ce contenu est un compl\u00e9ment des documents<b>\u00a0&lsquo;Les scripts Linux (P1 et P2)&rsquo;<\/b>, disponibles sur LEA. \u00a0Utilis\u00e9 seul, il ne permet pas d&rsquo;atteindre la comp\u00e9tence &laquo; Scripts Bash&rsquo; du cours 420-1C5.<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Il est important de consulter les documents P1 et P2 pour \u00eatre en mesure de r\u00e9ussir l&rsquo;\u00e9preuve synth\u00e8se.<\/strong><\/span><\/p>\n<hr \/>\n<h2><span style=\"color: #666699;\">Partie 1<\/span><\/h2>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: Avant de commencer, afficher le &lsquo;shell&rsquo; courant avec<\/p>\n<pre class=\"lang:default decode:true\">$ echo $SHELL\n\/bin\/bash<\/pre>\n<hr \/>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 01<\/span><\/strong> &#8211; Affichage<\/p>\n<pre class=\"lang:default decode:true \">#!\/bin\/bash\n# La ligne pr\u00e9c\u00e9dente est nomm\u00e9e 'script shebang ou bang line'\n\n# Ce script efface le terminal et affiche des info \u00e0 l'\u00e9cran\n\nclear\t\t\t\t# Efface l'\u00e9cran\n\necho \"Exemple 01\"\necho \"----------------------------------------------------------\"\necho \"D\u00e9but du script...\"\n\necho \"Bonjour, $USER!\"\t\t# $ pour obtenir le contenu d'une variable\necho                            # Affiche une ligne vide\n\necho \"Voici la liste des utilisateurs connect\u00e9s:\"\necho\t\t\t\t\t\t\t\nw\t\t\t\t\necho\t\t\t\t\n\necho \"Initialisation de deux variables:\"\nCOLOUR=\"rouge\"\t\t\t\t\t\nVALUE=\"3.14159256\"\t\t\t\t\t\necho -n \"La couleur est $COLOUR et \"\t# -n = pas de retour de chariot\t\necho \"le nombre est $VALUE\"\t\t\necho \n\necho \"Voil\u00e0, retour \u00e0 l'invite.\"\necho \"----------------------------------------------------------\"\necho<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 01.2<\/strong> <\/span>&#8211; Ins\u00e9rer des caract\u00e8res de contr\u00f4le dans une chaine.<\/p>\n<pre class=\"lang:default decode:true\"># Utilisation de echo -e\necho '------------------------------------------'\necho \"Bonjour \\n$USER !\"\necho '------------------------------------------'\necho -e \"Nous sommes le \\n\" ; date\necho '------------------------------------------'\necho -e \"Bonjour \\t$USER dont le UID est \\n$UID\"\necho '------------------------------------------'\necho -e 'Bonjour \\t$USER dont le UID est \\n$UID'\necho '------------------------------------------'<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 02<\/strong><\/span> &#8211;\u00a0D\u00e9verminage d&rsquo;un script<\/p>\n<pre class=\"lang:default decode:true\"># Tout le script\nbash -x exemple01\n\n# Une partie\n# Utilisation de set -+x dans le script\n\n\nset -x\t\t\t# d\u00e9verminage \u00e0 partir d'ici\nw\nset +x\t\t\t# fin du d\u00e9verminage<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 03<\/span> <\/strong>&#8211; Passer des param\u00e8tres au script<\/p>\n<pre class=\"lang:default decode:true\">#Exemple03\n#!\/bin\/bash\n# Description: Afficher un message \u00e0 partir de valeurs re\u00e7ues en entr\u00e9e.\n# ----------------------------------------------------------------------\n# Param 1\u00a0: pr\u00e9nom\n# Param 2\u00a0: nom\n# Usage: .\/Exemple02 prenom nom\n# ----------------------------------------------------------------------\necho \"Bonjour $1 $2, bienvenue au cours sur les scripts bash.\"\necho 'Bonjour $1 $2, bienvenue au cours sur les scripts bash.'<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 03.2<\/strong><\/span> &#8211; Boucler sur les param\u00e8tres re\u00e7us<\/p>\n<pre class=\"lang:default decode:true\"># Traiter tous les param\u00e8tres re\u00e7us avec 'for in do'\ncompteur=1\nfor num in \"$@\"\n do\n   echo \"param $compteur = $num\"\n   ((compteur++))\n done\n<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 04<\/span><\/strong> &#8211; Instruction &lsquo;if&rsquo; &#8211; V\u00e9rifier si le script a re\u00e7u des param\u00e8tres<\/p>\n<pre class=\"lang:default decode:true \">#Exemple04\n#!\/bin\/bash\n# Description: V\u00e9rifier si le script a re\u00e7u des param\u00e8tres\n# ----------------------------------------------------------------------\n# Param 1\u00a0: pr\u00e9nom\n# Param 2\u00a0: nom\n# Usage: .\/Exemple04 \n# ----------------------------------------------------------------------\nif [ $# -eq 0 ]   # si nb param == 0 alors\n  then\n    echo \"Usage: .\/Exemple02 prenom nom\"\n    exit 1        # sortir du script avec un code d'erreur\nfi\necho \"Bonjour $1 $2, bienvenue au cours sur les scripts bash.\"<\/pre>\n<p>Il est aussi possible de v\u00e9rifier si l&rsquo;argument no 1 est vide:<\/p>\n<pre class=\"lang:default decode:true \">if [ -z \"$1\" ]\n  then\n    echo \"D\u00e9sol\u00e9 pour vous, mais il n'y a pas d'argument :-( !\"\nfi<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 05<\/span> <\/strong>&#8211; Saisie \u00e0 partir du clavier<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/bash\n#Exemple05 -  instruction read - Saisie \u00e0 partir du clavier\necho '--------------------------------------'\necho \"Entrez un pr\u00e9nom suivi du nom\"\nread prenom nom \necho\necho \"Bonjour $prenom $nom\"\necho '--------------------------------------'\nexit 0<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 05.2<\/span><\/strong> &#8211; Validation de la saisie avec [[ ||, &amp;&amp;]]<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/bash\n#Exemple05.2 -  instruction read - Saisie \u00e0 partir du clavier\necho '--------------------------------------'\necho \"Entrez un pr\u00e9nom suivi du nom\"\nread prenom nom \n# Note: le double [[]] permet l'utilisation de filtre et d'une syntaxe moderne.\n# Par exemple  [[ $nom = \"m\"* ]] -&gt; nom d\u00e9bute par 'm'.  || pour OR et &amp;&amp; pour AND \nif [[ \"$prenom\" == \"\" || \"$nom\" == \"\" ]]  \n  then\n  echo \"Erreur: Il faut enter un pr\u00e9nom suivi d'un nom!!\"\n  exit 1\nfi\n\necho\necho \"Bonjour $prenom $nom\"\necho '--------------------------------------'\nexit 0<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: Les expressions complexes doivent \u00eatre entre [[ &#8230; ]]. \u00a0|| = OR<\/p>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 05.3<\/strong><\/span> &#8211; Exemple 5.2 avec syntaxe ancienne []<\/p>\n<pre class=\"lang:default decode:true \">#!\/bin\/bash\n#Exemple05c -  instruction read - Saisie \u00e0 partir du clavier\necho '--------------------------------------'\necho \"Entrez un pr\u00e9nom suivi du nom\"\nread prenom nom \n# Note: -0 = OR, -a = AND\n\nif [ -z \"$prenom\" -o -z \"$nom\" ]  \n  then\n  echo \"Erreur: Il faut enter un pr\u00e9nom suivi d'un nom!!\"\n  exit 1\nfi\n\necho\necho \"Bonjour $prenom $nom\"\necho '--------------------------------------'\nexit 0<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 06<\/strong><\/span> &#8211; Les variables d&rsquo;environement<\/p>\n<pre class=\"lang:default decode:true \"># Voici quelques variables d'environnement \n# Liste obtenue avec le commande 'set'\n\nBASH_VERSION\nHISTFILE\nHOME\nLOGNAME\n\n$ echo $BASH_VERSION\n\n# -----------------------------------------------\n# D\u00e9finir une variable d'ENV:\n\n# Note:  Pas d'espace lors de la d\u00e9claration\n$ maVariable=\"Je suis moi\"\n\n$ echo $maVariable\n\n# -------------------------------------------------\n# Utilisation de caract\u00e8res sp\u00e9ciaux dans la chaine\n\n$ message=\"Ce \\\"texte\\\" \\\\n contient des car sp\u00e9ciaux\"\n\n\n$ msg3=\"Ligne 1\\nLigne 2\"\n$ echo -e \"$msg3\"\n\n# --------------------------------------------------------\n# D\u00e9finir une variable \u00e0 partir du r\u00e9sultat d'une commande \n$ ladate=$(date +%Y-%m-%d)\n$ echo $ladate\n\n# Autre syntaxe possible (plus ancienne) - apostrophe invers\u00e9\n\n$ liste=`ls`\n$ echo $liste\n\n# -----------------------------------------------\n# Rendre la variable disponible pour les scripts\n# La commande 'export' nomVariable\n\n$ export maVariable\n\n# -----------------------------------------------\n# Supprimer une variable\n\n$ unset maVariable\n\n# -----------------------------------------------\n# Substitution de variables\ntp=\"\/version\"\necho $tp\nver=$tp1\t\t# la variable tp1 n\u2019existe pas alors ver = une chaine vide, \necho $ver \t\t# la variable 'ver' n'a pas \u00e9t\u00e9 cr\u00e9\u00e9e!\nver=${tp}1\t\t# Substitution de la variable tp\necho $ver \t\t# \/version1\n\n# Note, il est aussi possible de l'\u00e9crire ainsi:\nver=\"$tp\"1\n\n<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 07<\/strong> <\/span>&#8211; Les tableaux<\/p>\n<pre class=\"lang:default decode:true\"># D\u00e9clarer un tableau\n$ amis[0]=Bob\n$ amis[1]=Bob\n$ amis[2]=Toto\n$ amis[3]=France\n\n$ echo ${amis[0]}\n\n# Afficher tous les \u00e9l\u00e9ments d'un tableau\n$ echo ${amis[@]}\n<\/pre>\n<hr \/>\n<h2><strong><span style=\"color: #ff0000;\"><span style=\"color: #666699;\">Partie 2<br \/>\n<\/span><\/span><\/strong><\/h2>\n<h3>L&rsquo;instruction &lsquo;if&rsquo;<\/h3>\n<h2>Les quatre formes de l&rsquo;instruction if:<\/h2>\n<h3>Forme 1 &#8211; Expression arithm\u00e9tique, avec (())<\/h3>\n<ul>\n<li>if (( 1==1 ));then echo oui; fi<\/li>\n<\/ul>\n<h3>Forme \u00a02 &#8211; Tester la valeur de retour d&rsquo;une commande, avec ()<\/h3>\n<ul>\n<li>if (mkdir test3);then echo dossier cr\u00e9\u00e9; fi<\/li>\n<\/ul>\n<h3>Forme 3 &#8211; Un test simple (ancienne syntaxe), avec [ \u00a0]<\/h3>\n<ul>\n<li>if [ -z &laquo;  &raquo; ]; then echo &laquo; la chaine est vide &raquo;; fi<\/li>\n<\/ul>\n<h3>Forme 4 &#8211; Un test avec une syntaxe plus complexe et moderne, avec [[ \u00a0]]<\/h3>\n<ul>\n<li>if [[ &laquo; $prenom &raquo; == &laquo;  &raquo; || &laquo; $nom &raquo; == &laquo;  &raquo; ]]; then echo &laquo; Au moins une des 2 chaines est \u00a0vide &raquo;; fi<\/li>\n<\/ul>\n<h2><strong style=\"font-size: 16px;\"><span style=\"color: #ff0000;\">Exemple 08<\/span><\/strong><span style=\"font-size: 16px;\"> &#8211; L&rsquo;instruction &lsquo;if&rsquo; &#8211; Tester des valeurs enti\u00e8res<\/span><\/h2>\n<pre class=\"lang:default decode:true\"># Utilisation de la commande 'if'\n# NOTE: [] est un synonyme de la commande 'test'\n# Voir: man test\n# --------------------------------------\n# un si simple\n# if [ test ]\n# then\n#  echo \"le test est pass\u00e9\"\n# fi # on ferme toujours la condition par fi (if en verlan !)\n\n# et avec un else if et un else\n# if [ test ]\n# then\n#   echo \"le test est pass\u00e9\"\n# elif [ test2 ]\n#   echo \"le test2 est pass\u00e9\"\n# else\n#  echo \"les deux tests ont \u00e9chou\u00e9\"\n##fi\n# --------------------------------------\n\nnum=10  # Definir une variable num\u00e9rique\n\necho \"--------------------------------------\"\necho -e \"Test sur un nombre:\\n\\n\"\nif [ $num -lt 99 ]\nthen\n  echo \"la variable est inf\u00e9rieure \u00e0 99\"\nfi\n\nif [ $num -eq 11 ]\nthen\n  echo \"la variable est \u00e9gale \u00e0 11\"\nfi\necho \"--------------------------------------\"\n\n\n# Synthase compacte\nif [ \"test\" == \"test\" ]; then\n  echo -ne \"\\nle test: \"\n  echo -n \"if [ \\\"test\\\" == \\\"test\\\" ] \"\n  echo -e \"est pass\u00e9!\\n\"\nfi\n\necho \"--------------------------------------\"\n\n<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 09<\/strong> <\/span>&#8211; Tester si un fichier est pr\u00e9sent dans le r\u00e9pertoire<\/p>\n<pre class=\"lang:default decode:true \">#!\/bin\/bash\n#Exemple09 -  V\u00e9rifier si un fichier est pr\u00e9sent\n\nclear\necho '--------------------------------------'\necho -n \"Entrez le nom d'un fichier: \"\nread fichier \nif [ -a \"$fichier\" ]  \n  then\n  echo -e \"\\nLe fichier $fichier est pr\u00e9sent dans le dossier $(pwd)\"\n  else\n  echo -e \"\\nErreur: Le fichier $fichier n'est pas pr\u00e9sent dans le dossier $(pwd)\"\nfi\necho<\/pre>\n<hr \/>\n<h2><span style=\"color: #666699;\">Partie 3 &#8211; Utilisation de la commande &lsquo;test&rsquo;<\/span><\/h2>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: Voir le document de cours pour les d\u00e9tails sur l&rsquo;utilisation de la commande &lsquo;test&rsquo;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 10<\/strong><\/span> &#8211; Tester des valeurs num\u00e9riques<\/p>\n<pre class=\"lang:default decode:true \">#Exemple 10\n#!\/bin\/bash\n# Comparer deux nombres avec l'instruction 'test'\nclear\nPI=31415\nNBOR=16180\n\necho \"Ce script bash compare deux nombres avec la commande 'test'\"\necho \"-----------------------------------------------------------\"\necho\n\n# Note: Bash supporte seulement les nombres entiers.\nif test $PI -lt $NBOR                   # PI &lt; NBOR ?\nthen\n        echo \"$PI est plus petit que $NBOR\"\nelif test $PI -gt $NBOR                 # PI &gt; NBOR ?\nthen\n        echo \"$PI est plus grand que $NBOR\"\nelse\n        echo \"$PI est \u00e9gal \u00e0 $NBOR\"\nfi<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: \u00a0Il est possible de v\u00e9rifier que la chaine saisie contient seulement des caract\u00e8res num\u00e9rique:<\/p>\n<pre class=\"lang:default decode:true \">if [[ $nb == ?(-)+([0-9]) ]];then ; echo \"$nb est un entier\" ; fi<\/pre>\n<p>R\u00e9f\u00e9rence: <a href=\"https:\/\/www.gnu.org\/savannah-checkouts\/gnu\/bash\/manual\/bash.html#Pattern-Matching\">Bash Pattern matching<\/a><\/p>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 10.2<\/strong><\/span> &#8211; Tester si une chaine est vide<\/p>\n<pre class=\"lang:default decode:true\">#Exemple 10.2\n#!\/bin\/bash\n# Saisir deux nombres et les comparer avec l'instruction [ test ]\nclear\necho -n \"Entrez deux nombres entiers s\u00e9par\u00e9s par un espace: \" \nread nb1 nb2\n\n# Tester si deux valeurs ont \u00e9t\u00e9 saisies:\n# Combinaison de tests avec &amp;&amp; (AND) et || (OR)\n# test -z, tester si une chaine est vide\nif [ -z $nb1 ] || [ -z $nb2 ] ; then\n        echo \"Erreur:  Il faut fournir deux nombres!!\"\n        exit 1\nfi\n\n# Note: Bash supporte seulement les nombres entiers.\nif test $nb1 -lt $nb2                   # nb1 &lt; nb2 ?\nthen\n        echo \"$nb1 est plus petit que $nb2\"\nelif test $nb1 -gt $nb2                 # nb1 &gt; nb2 ?\nthen\n        echo \"$nb1 est plus grand que $nb2\"\nelse\n        echo \"$nb1 est \u00e9gal \u00e0 $nb2\"\nfi<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 11<\/strong><\/span> &#8211; V\u00e9rifier si un groupe existe dans le fichier \/etc\/group<\/p>\n<pre class=\"lang:default decode:true\">#Exemple 11\n#!\/bin\/bash\n# Saisir un nom de groupe puis v\u00e9rifier s'il existe avec la commande 'grep'\nclear\necho -n \"Entrez le nom d'un groupe: \"\nread groupe\n\n# Tester si le nom du groupe a \u00e9t\u00e9 saisie:\nif  test -z $groupe  ; then\n        echo \"Erreur:  Il faut fournir le nom d'un groupe!\"\n        exit 1\nfi\n\n\n# Note: grep -q = ne pas afficher le r\u00e9sultat \u00e0 l'\u00e9cran\nif grep -q $groupe \/etc\/group\nthen\n  echo \"Le groupe: $groupe est pr\u00e9sent dans le fichier \/etc\/group\"\nelse\n  echo \"Le groupe: $groupe n'est pas pr\u00e9sent dans le fichier \/etc\/group\"\nfi\n\n\n#------------------------------------------------------\n# Autre fa\u00e7on de tester: grep -E \"^$groupe:\" \/etc\/group<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 12<\/strong><\/span> &#8211; Valeur de retour d&rsquo;une commande<\/p>\n<pre class=\"lang:default decode:true \">#Exemple 12\n\necho \"Ce script retourne le nombre de param\u00e8tres re\u00e7us\"\necho \"Cette valeur sera disponible, \u00e0 la sortie du script, dans la variable '\\$?'\"\n\n# $# = nb de param re\u00e7u.\nexit $#<\/pre>\n<p>$ echo $?<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: La variable $? est l&rsquo;\u00e9quivalent de ERRORLEVEL sous CMD de Windows.<\/p>\n<hr \/>\n<h2><span style=\"color: #666699;\">Partie 4 &#8211; La commande &lsquo;case&rsquo;<\/span><\/h2>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 13<\/strong><\/span> &#8211; Valider un choix multiple<\/p>\n<pre class=\"lang:default decode:true\">#Exemple13\n#!\/bin\/bash\nclear\necho    \"Exemple d'utilisation de la commande 'case'\"\necho -e \"-------------------------------------------\\n\"\necho \"---&gt; case - exemple 1\"\nread -p \"Effacer le disque rigide O\/N? \" jaipeur\n\ncase $jaipeur in\n# Note: Uitlisation de la substitution de variable pour former les mots oui et non.\n o|O)   echo \"Vous avex r\u00e9pondu ${jaipeur}ui :--( !\" ;;\n n|N)   echo \"Sage d\u00e9cision d'avoir r\u00e9pondu ${jaipeur}on\" ;;\n   *)   echo \"R\u00e9ponse erron\u00e9e!\" ; exit\nesac\n\n\necho \"---&gt; case - exemple 2\"\nread -p \"Veuillez entrer une cha\u00eene de caract\u00e8res: \" param\n\ncase $param in\n 0|1|2|3|4|5|6|7|8|9) echo \"$param est un chiffre\" ;;\n          [0-9][0-9]) echo \"$param est un nombre \u00e0 deux chiffres\" ;;\n           [a-zA-Z]*) echo \"$param est un mot\" ;;\n                   *) echo \"$param est non pr\u00e9vu\" ;;\nesac<\/pre>\n<p><strong><span style=\"color: #ff0000;\">Note<\/span><\/strong>: L&rsquo;exemple pr\u00e9c\u00e9dent valide seulement des nombres \u00e0 un ou deux caract\u00e8res de long. \u00a0Voici une solution plus \u00e9l\u00e9gante:<\/p>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 14<\/strong><\/span> &#8211; Utilisation de &lsquo;<a href=\"http:\/\/www.gnu.org\/software\/bash\/manual\/bashref.html#Pattern-Matching\" rel=\"noreferrer\">shell pattern matching<\/a>&lsquo;.<\/p>\n<pre class=\"lang:default decode:true \"># Exemple 14\n# Projet: 420-1C5.bash-file\n# Auteur: Alain Boudreault\n# Date: 2020.12.06\n# Description: Tester un nombre avec 'pattern matching'\n# -----------------------------------------------------\n# Note: Pour permettre le 'pattern matching' \n# La ligne suivante est n\u00e9cessaire sous bash\nshopt -s extglob\n\n# Boucle principale du programme\nwhile true; do\n  clear\n  echo -n \"Entrez un nombre long: \"\n  read unNombre\n    case $unNombre in\n\n      ( +([0-9]) ) echo \"$unNombre est un nombre valide\"\n                   break 2 ;;  # \/\/ sortir des 2 blocs de code\n                *) echo \"$unNombre est invalide!\"\n                   echo \"Appuyer sur retour pour recommencer ...\"; read;;\n    esac # Fin du case\n\ndone # Fin du while\n\n# break 2 pointe ICI\necho \"--- Fin du programme ---\"<\/pre>\n<hr \/>\n<h2><span style=\"color: #666699;\">Partie 5 &#8211; La commande while<\/span><\/h2>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 15<\/strong> <\/span>&#8211; Une boucle while tant que fichier n&rsquo;est pas trouv\u00e9<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/bash\n#Exemple15\n\n# D\u00e9but du programme\nclear\necho -n \"Entrez un nom de fichier: \"\nread fichier\n\nwhile [ ! -e \"$fichier\" ] # Boucler tant que le fichier est inexistant\ndo \n  echo \"Fichier $fichier introuvable, appuyer sur retour pour recommencer...\"\n  read\n  clear\n  echo -n \"Entrez un nom de fichier: \"\n  read fichier\ndone\n\necho\necho \"--------------------------------------------------------\"\necho \"Le fichier $fichier est pr\u00e9sent sur le volume.\"\necho<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Exemple 15b<\/strong><\/span> &#8211; Normalisation de l&rsquo;exemple pr\u00e9c\u00e9dent &#8211; Utilisation d&rsquo;une fonction<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/bash\n#Exemple15b\n\n# Les fonctions\nfunction lireNomFichier () {\n  echo \"Entrez un nom de fichier\"\n  read fichier\n}\n\n# D\u00e9but du programme\nclear\n\nlireNomFichier\n\nwhile [ ! -e \"$fichier\" ] # Boucler tant que le fichier est inexistant\ndo \n  echo \"Fichier $fichier introuvable, appuyer sur retour pour recommencer...\"\n  read\n  clear\n  lireNomFichier\ndone\n\necho\necho \"--------------------------------------------------------\"\necho \"Le fichier $fichier est pr\u00e9sent sur le volume.\"\necho<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 15c<\/strong><\/span> &#8211; Une boucle sans fin<\/p>\n<pre class=\"lang:default decode:true\">while true; do  # ctrl+c pour quitter\n  echo \"Je suis une boucle sans fin -  ;-)\"\ndone<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 15d<\/strong> <\/span>&#8211; Afficher l&rsquo;heure dans une boucle while<\/p>\n<pre class=\"lang:default decode:true\">#Exemple15d\n#!\/bin\/bash\n# Afficher l'heure \u00e0 toutes les secondes\nwhile true\ndo\n  clear\n  echo -n \"Bonjour $USER, il est: \";\n  date +\"%H.%m.%S\"\n  echo \"CTRL+C pour quitter\"\n  sleep 1\ndone<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 16<\/span> <\/strong>&#8211; Boucler sur un contenu de redirection<\/p>\n<pre class=\"lang:default decode:true \">#Exemple16\n#!\/bin\/bash\nfich=\"\/etc\/passwd\"\nnumeroLigne=1\n\nwhile read ligne\ndo\n  if [[ $ligne = \"m\"* ]]  # Afficher la ligne si le texte commence par 'm'\n  then\n    echo \"----------------------------------------------------------------\"\n    echo \"R\u00e9sultat trouv\u00e9 \u00e0 la ligne $numeroLigne\"\n    echo $ligne\n    echo \"----------------------------------------------------------------\"\n  fi\n((numeroLigne+=1))\ndone &lt; \"${fich}\"<\/pre>\n<p><span style=\"color: #ff0000;\"><strong><br \/>\nExemple 17<\/strong><\/span> &#8211; until do &#8230; done<\/p>\n<pre class=\"lang:default decode:true \">#!\/bin\/bash\n#Exemple17\n\nuntil\n  echo -e \"Entrez le nom du fichier \u00e0 afficher\"\n  read fich\n  [ -e \"$fich\" ] # NOTE: Boucle tant que cette condition est fausse\ndo \n   echo -e \"Fichier inexistant, saisie \u00e0 recommencer...\" \ndone\n\necho \"---------------------------------------------------------\"\necho \"Voici le contenu du fichier: $fich\"\necho\ncat $fich<\/pre>\n<p><strong><span style=\"color: #ff0000;\"><br \/>\nExemple 18<\/span><\/strong> &#8211; choix multiple via un menu, select in &#8230;<\/p>\n<pre class=\"lang:default decode:true\">#Exemple18\n#!\/bin\/bash\n# Exemple d'utilisation de l'instruction select\nPS3=\"Entrez le num\u00e9ro de votre choix -&gt; \"\necho \"Que d\u00e9sirez-vous boire ?\"\nselect boisson in \"Rien, merci\" \"Caf\u00e9\" \"Th\u00e9 au lait\" \"Chocolat\"\ndo\n\tif [ -z \"$boisson\" ]\n\tthen\n\t\techo \"Erreur : entrez un des chiffres propos\u00e9s.\"\n\telif [ \"$REPLY\" -eq 1 ]\n\tthen\n\t\techo \"Au revoir !\"\n\t\tbreak\n\telse\n\t\techo \"Vous avez fait le choix num\u00e9ro $REPLY ...\"\n\t\techo \"Le $boisson vous sera servi dans un instant !\"\n\t\techo \"Autre chose ?\"\n\tfi\n\techo\ndone<\/pre>\n<hr \/>\n<h2><span style=\"color: #666699;\"><span style=\"caret-color: #ff0000;\"><b>Laboratoire<\/b><\/span><\/span><\/h2>\n<p>La commande &lsquo;<strong>getent<\/strong>&lsquo; permet de v\u00e9rifier des param\u00e8tres syst\u00e8mes.<\/p>\n<p>Par exemple, pour v\u00e9rifier si l&rsquo;utilisateur &lsquo;toto&rsquo; existe;<\/p>\n<p>$ getent passwd toto<\/p>\n<p>Si la commande retourne une valeur autre que \u00a0&lsquo;0&rsquo; c&rsquo;est que l&rsquo;op\u00e9ration n&rsquo;a pas r\u00e9ussit.<\/p>\n<p>$ echo $?<\/p>\n<p>$ 2<\/p>\n<p>Pour supprimer les messages, normaux et erreurs, d&rsquo;une commande:<\/p>\n<p>$\u00a0getent passwd toto &amp;&gt; \/dev\/null<br \/>\n$ addgroup 456abc\u00a0 &amp;&gt; \/dev\/null<\/p>\n<p>Voir la documentation &lsquo;man getent&rsquo;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Action<\/strong><\/span> &#8211; \u00c9crire un script &lsquo;creerGroupes&rsquo;;<\/p>\n<ul>\n<li>qui re\u00e7oit en param\u00e8tres une liste de groupes \u00e0 cr\u00e9er,<\/li>\n<li>les noms des groupes sont s\u00e9par\u00e9s par des espaces,<\/li>\n<li>le script va cr\u00e9er un groupe seulement s&rsquo;il n&rsquo;est pas d\u00e9j\u00e0 pr\u00e9sent,<\/li>\n<li>s&rsquo;il n&rsquo;y a pas de param\u00e8tres re\u00e7us alors le script affiche:\n<ul>\n<li>Usage: creerGroupes nom1 [nom2 &#8230; ]<\/li>\n<li>Le script quitte et retourne la valeur 99.<\/li>\n<\/ul>\n<\/li>\n<li>\u00e0 la cr\u00e9ation du groupe il faut afficher un des trois messages suivants:\n<ul>\n<li>Cr\u00e9ation du groupe &lsquo;nom du groupe&rsquo; r\u00e9ussit<\/li>\n<li>Le groupe &lsquo;nom du groupe&rsquo; existe d\u00e9j\u00e0<\/li>\n<li>Erreur: \u00a0Nom du groupe invalide: &lsquo;nom du groupe&rsquo;.<\/li>\n<\/ul>\n<\/li>\n<li>\u00e0 la fin du script, il faut afficher le message suivant:\n<ul>\n<li><strong><span style=\"color: #ff0000;\"><span style=\"caret-color: #ff0000;\">x<\/span><\/span><\/strong> groupe(s) sur <strong><span style=\"color: #ff0000;\">n<\/span><\/strong>\u00a0de cr\u00e9\u00e9(s) &#8211; \u00a0Il faut accorder en fonction du nombre de groupes cr\u00e9\u00e9s.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici ce que produit le script:<\/p>\n<pre class=\"lang:default decode:true \">Exemple 1 - avec des groupes existants\n\n$ sudo .\/creerGroupes users root\n\n----------------------------------------\nTraitement du groupe 'users'\nErreur: Le groupe 'users' existe d\u00e9j\u00e0\n\n----------------------------------------\nTraitement du groupe 'root'\nErreur: Le groupe 'root' existe d\u00e9j\u00e0\n\n0 groupe sur 2 de cr\u00e9\u00e9\n\n\nExemple 2 - avec un nom invalide\n\n$ sudo .\/creerGroupes 444abc\n\n----------------------------------------\nTraitement du groupe '444abc'\nErreur: Nom du groupe invalide: '444abc'\n\n0 groupe sur 1 de cr\u00e9\u00e9\n\n\nExemple 3 - avec trois nouveaux groupes valides\n\n$ sudo .\/creerGroupes groupe01 groupe02 groupe99\n\n----------------------------------------\nTraitement du groupe 'groupe01'\nCr\u00e9ation du groupe 'groupe01' r\u00e9ussit\n\n----------------------------------------\nTraitement du groupe 'groupe02'\nCr\u00e9ation du groupe 'groupe02' r\u00e9ussit\n\n----------------------------------------\nTraitement du groupe 'groupe99'\nCr\u00e9ation du groupe 'groupe99' r\u00e9ussit\n\n3 groupes sur 3 de cr\u00e9\u00e9s\n\n\n<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Note<\/strong><\/span>: \u00a0Il y aura une question semblable \u00e0 l&rsquo;\u00e9preuve synth\u00e8se.<\/p>\n<hr \/>\n<p><b>Sortie et reprise d\u2019une boucle &#8211; Voir le document pdf \u00a0&lsquo;Les scripts Linux (P2)&rsquo;<\/b><\/p>\n<p><strong>Les fonctions &#8211; <b>Voir le document pdf \u00a0&lsquo;Les scripts Linux (P2)&rsquo;<\/b><\/strong><\/p>\n<p><strong>Divers<\/strong> &#8211;\u00a0<b>Voir le document pdf \u00a0&lsquo;Les scripts Linux (P2)&rsquo;<\/b><\/p>\n<hr \/>\n<h2><span style=\"color: #666699;\">R\u00e9f\u00e9rence pour la commande &lsquo;test&rsquo; [] &#8211; $ man test<\/span><\/h2>\n<pre class=\"lang:default decode:true \">test: test [expr]\n    Evaluate conditional expression.\n    \n    Exits with a status of 0 (true) or 1 (false) depending on\n    the evaluation of EXPR.  Expressions may be unary or binary.  Unary\n    expressions are often used to examine the status of a file.  There\n    are string operators and numeric comparison operators as well.\n    \n    The behavior of test depends on the number of arguments.  Read the\n    bash manual page for the complete specification.\n    \n    File operators:\n    \n      -a FILE        True if file exists.\n      -b FILE        True if file is block special.\n      -c FILE        True if file is character special.\n      -d FILE        True if file is a directory.\n      -e FILE        True if file exists.\n      -f FILE        True if file exists and is a regular file.\n      -g FILE        True if file is set-group-id.\n      -h FILE        True if file is a symbolic link.\n      -L FILE        True if file is a symbolic link.\n      -k FILE        True if file has its `sticky' bit set.\n      -p FILE        True if file is a named pipe.\n      -r FILE        True if file is readable by you.\n      -s FILE        True if file exists and is not empty.\n      -S FILE        True if file is a socket.\n      -t FD          True if FD is opened on a terminal.\n      -u FILE        True if the file is set-user-id.\n      -w FILE        True if the file is writable by you.\n      -x FILE        True if the file is executable by you.\n      -O FILE        True if the file is effectively owned by you.\n      -G FILE        True if the file is effectively owned by your group.\n      -N FILE        True if the file has been modified since it was last read.\n    \n      FILE1 -nt FILE2  True if file1 is newer than file2 (according to\n                       modification date).\n    \n      FILE1 -ot FILE2  True if file1 is older than file2.\n    \n      FILE1 -ef FILE2  True if file1 is a hard link to file2.\n    \n    All file operators except -h and -L are acting on the target of a symbolic\n    link, not on the symlink itself, if FILE is a symbolic link.\n    \n    String operators:\n    \n      -z STRING      True if string is empty.\n    \n      -n STRING\n         STRING      True if string is not empty.\n    \n      STRING1 = STRING2\n                     True if the strings are equal.\n      STRING1 != STRING2\n                     True if the strings are not equal.\n      STRING1 &lt; STRING2\n                     True if STRING1 sorts before STRING2 lexicographically.\n      STRING1 &gt; STRING2\n                     True if STRING1 sorts after STRING2 lexicographically.\n    \n    Other operators:\n    \n      -o OPTION      True if the shell option OPTION is enabled.\n      -v VAR         True if the shell variable VAR is set.\n      -R VAR         True if the shell variable VAR is set and is a name\n                     reference.\n      ! EXPR         True if expr is false.\n      EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.\n      EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.\n    \n      arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,\n                     -lt, -le, -gt, or -ge.\n    \n    Arithmetic binary operators return true if ARG1 is equal, not-equal,\n    less-than, less-than-or-equal, greater-than, or greater-than-or-equal\n    than ARG2.\n    \n    See the bash manual page bash(1) for the handling of parameters (i.e.\n    missing parameters).\n    \n    Exit Status:\n    Returns success if EXPR evaluates to true; fails if EXPR evaluates to\n    false or an invalid argument is given.<\/pre>\n<hr \/>\n<h5 style=\"text-align: right;\"><span style=\"color: #808080;\">Document pr\u00e9par\u00e9 par Alain Boudreault, pour les \u00e9tudiants du cours 420-1C5, r\u00e9vision 2<\/span><\/h5>\n","protected":false},"excerpt":{"rendered":"<p>Introduction aux scripts bash Attention: Ce contenu est un compl\u00e9ment des documents\u00a0&lsquo;Les scripts Linux (P1 et P2)&rsquo;, disponibles sur LEA. \u00a0Utilis\u00e9 seul, il ne permet pas d&rsquo;atteindre la comp\u00e9tence &laquo; Scripts Bash&rsquo; du cours 420-1C5. Il est important de consulter les documents P1 et P2 pour \u00eatre en mesure de r\u00e9ussir l&rsquo;\u00e9preuve synth\u00e8se. Partie 1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/pages\/1407"}],"collection":[{"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1407"}],"version-history":[{"count":36,"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/pages\/1407\/revisions"}],"predecessor-version":[{"id":2016,"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=\/wp\/v2\/pages\/1407\/revisions\/2016"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/420-3c3\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}