Rapport sur les scripts Bash
Table of Contents
Présentation générale
Premier script
Présentation
Le premier script que je vais présenter permet de modifier l’invite de commande du terminale de Linux. Il lui donne un coté ludique avec l’apparition de smiley aléatoire, et un ajout de couleur.
Détail du code
Fonctions auxiliaires
function random { min=1 max=3 echo $(( $RANDOM % ($max - $min + 1) + $min )) } function smile { if [[ $(random) == 1 ]]; then echo ":)" elif [[ $(random) == 2 ]]; then echo ":(" elif [[ $(random) == 3 ]]; then echo ":|" else echo "XD" fi }
Grace à ces deux fonctions, on peut générer un smiley aléatoire qui apparaitra au niveau de l’invite de commande. La fonction random permet de générer un nombre aléatoire. Dans la fonction smile, on assigne chaque smiley à un nombre. Si le nombre est celui tiré par la fonction random, alors on affiche le smiley correspondant. Sinon, on réessaye avec un autre smiley.
Boucle principale
while true do read -p "$(echo -e "\033[1;32m$(whoami)@$(hostname): \033[1;36m$(pwd) \033[1;35m$(date) \033[1;31m$(smile) \033[0m$ ")" if [ "$REPLY" = "exit" ]; then echo "A bientot" exit 0 fi done
La boucle while permet de garder la même invite de commande affichée tant que l’on a pas tapé exit. Alors, on affiche diverses informations en faisant appel aux fonctions dont on a besoin. La couleur est modifiée grace aux codes du type \033[1;35m.
Code complet
#!/bin/bash function random { min=1 max=3 echo $(( $RANDOM % ($max - $min + 1) + $min )) } function smile { if [[ $(random) == 1 ]]; then echo ":)" elif [[ $(random) == 2 ]]; then echo ":(" elif [[ $(random) == 3 ]]; then echo ":|" else echo "XD" fi } echo "Voici une invite de commande amusante! Pour revenir à une invite plus classique, écrivez \"exit\" dans le terminal" while true do read -p "$(echo -e "\033[1;32m$(whoami)@$(hostname): \033[1;36m$(pwd) \033[1;35m$(date) \033[1;31m$(smile) \033[0m$ ")" if [ "$REPLY" = "exit" ]; then echo "A bientot" exit 0 fi done
Exemple d’utilisation
Voici ci dessous une capture d’écran du rendu de l’invite de commande.
Second script
Présentation
Ce script a pour but de simuler un robot interractif, avec qui il est possible de parler, ou de jouer à des jeux. Afin d’interragir avec, il faut écrire dans le terminal une des réponses qu’il propose. Il s’adapte en cas de réponse ne rentrant pas dans les critères, en demandant à nouveau à l’utilisateur de choisir. Mais le meilleur moyen de le découvrir reste de le tester.
Détail du code
Fonctions lancer de dé
function random { min=$1 max=$2 echo $(( $RANDOM % ($max - $min + 1) + $min )) } function dice { choose=$1 rep=$(random 1 $2) if [[ $choose == $rep ]]; then echo "Tu as trouvé! Bien joué." elif [[ $choose != $rep ]]; then echo "Dommage... C'était $rep" fi } function dicelevel { lvl=$1 if [[ $lvl == 1 ]]; then rand1=2 elif [[ $lvl == 2 ]]; then rand1=5 elif [[ $lvl == 3 ]]; then rand1=10 fi }
Ce premier groupe de fonction simule un lancer de dé avec un interval variable. Le but est le suivant, le joueur choisi un niveau de difficulté qui est appliqué au tirage grace à la fonction dicelevel (selon le niveau l’interval sera plus ou moins grand). Ensuite, un tirage est appliqué grace aux fonctions random (deja vu lors du premier script) et dice. De plus, la fonction dice permet de vérifier si le nombre choisi par l’utilisateur est le même que celui tiré au hasard. Elle renvoi alors le message correspondant.
Fonctions pictionary
function draw { level=$(random 1 3) if [[ $level == 1 ]];then echo -e "_____8888888888____________________\n____888888888888888_________________\n__888888822222228888________________\n_88888822222222288888_______________\n888888222222222228888822228888______\n888882222222222222288222222222888___\n8888822222222222222222222222222288__\n_8888822222222222222222222222222_88_\n__88888222222222222222222222222__888\n___888822222222222222222222222___888\n____8888222222222222222222222____888\n_____8888222222222222222222_____888_\n______8882222222222222222_____8888__\n_______888822222222222______888888__\n________8888882222______88888888____\n_________888888_____888888888_______\n__________88888888888888____________\n___________8888888888_______________\n____________8888888_________________\n_____________88888__________________\n______________888___________________\n_______________8____________________\n" elif [[ $level == 2 ]];then echo -e " _..._ .' '. _ / .-\"\"-\ _/ \\ .-| /:. | | | | \\ |:. /.-'-./ | .-'-;:__.' =/ .'= *=|NASA _.=' / _. | ; ;-.-'| \\ | / | \\ _\\ _\\ \\__/'._;. ==' ==\\ \\ \\ | / / / /-._/-._/ \\ \`\\ \\ \`-._/._/" elif [[ $level == 3 ]]; then echo -e " ,___ .-;' \`\"-.\`\\_...._/\`.\` , \\ / .-' ', / () ()\\ \`'._ \\ /() . (| > .' ;, -'- / / < |;, __.; '-.'-.| , \\ , \\ \`>.|;, \\_) \\_) \`-; , / \\ / < '. <\`'-,_) '._)" fi } function drawverif { if [[ $level == 1 ]]; then if [[ $1 == "coeur" ]]; then echo "Bien joué, c'était bien un coeur!" else echo "Dommage... C'était un coeur" fi elif [[ $level == 2 ]]; then if [[ $1 == "astronaute" ]]; then echo "Bien joué, c'était bien un astronaute!" else echo "Dommage... C'était un astronaute" fi elif [[ $level == 3 ]]; then if [[ $1 == "pikachu" ]]; then echo "Bien joué, c'était bien un pikachu!" else echo "Dommage... C'était un pikachu" fi fi }
Ce groupe de fonction permet de simuler un pictionnary, le but est de trouver ce que représente le dessin en art ASCII affiché. La fonction draw fait appel à la fonction random et permet d’aficher aléatoirement un des dessins enregistré. La difficulté de ce code était d’adapter le dessin à la syntaxe du bash. Il fallait donc ajouter des caractère spéciaux afin de rendre inactifs certains caractères utilisés dans le dessin. Enfin, la fonction drawverif permet de vérifier la réponse de l’utilisateur et/ou d’afficher la bonne réponse si nécessaire.
Boucle principale
Nous allons maintenant nous intéresser à la boucle principale du script (on peut la retrouver ci dessous dans le code complet du programme). Elle permet d’afficher les différentes options d’interraction et réutilise les fonctions décrites précedement. Elle est essentiellement composé de boucle conditionnelle et de commandes d’affichage.
Code complet
#!/usr/bin/env bash function random { min=$1 max=$2 echo $(( $RANDOM % ($max - $min + 1) + $min )) } function dice { choose=$1 rep=$(random 1 $2) if [[ $choose == $rep ]]; then echo "Tu as trouvé! Bien joué." elif [[ $choose != $rep ]]; then echo "Dommage... C'était $rep" fi } function dicelevel { lvl=$1 if [[ $lvl == 1 ]]; then rand1=2 elif [[ $lvl == 2 ]]; then rand1=5 elif [[ $lvl == 3 ]]; then rand1=10 fi } function draw { level=$(random 1 3) if [[ $level == 1 ]];then echo -e "_____8888888888____________________\n____888888888888888_________________\n__888888822222228888________________\n_88888822222222288888_______________\n888888222222222228888822228888______\n888882222222222222288222222222888___\n8888822222222222222222222222222288__\n_8888822222222222222222222222222_88_\n__88888222222222222222222222222__888\n___888822222222222222222222222___888\n____8888222222222222222222222____888\n_____8888222222222222222222_____888_\n______8882222222222222222_____8888__\n_______888822222222222______888888__\n________8888882222______88888888____\n_________888888_____888888888_______\n__________88888888888888____________\n___________8888888888_______________\n____________8888888_________________\n_____________88888__________________\n______________888___________________\n_______________8____________________\n" elif [[ $level == 2 ]];then echo -e " _..._ .' '. _ / .-\"\"-\ _/ \\ .-| /:. | | | | \\ |:. /.-'-./ | .-'-;:__.' =/ .'= *=|NASA _.=' / _. | ; ;-.-'| \\ | / | \\ _\\ _\\ \\__/'._;. ==' ==\\ \\ \\ | / / / /-._/-._/ \\ \`\\ \\ \`-._/._/" elif [[ $level == 3 ]]; then echo -e " ,___ .-;' \`\"-.\`\\_...._/\`.\` , \\ / .-' ', / () ()\\ \`'._ \\ /() . (| > .' ;, -'- / / < |;, __.; '-.'-.| , \\ , \\ \`>.|;, \\_) \\_) \`-; , / \\ / < '. <\`'-,_) '._)" fi } function drawverif { if [[ $level == 1 ]]; then if [[ $1 == "coeur" ]]; then echo "Bien joué, c'était bien un coeur!" else echo "Dommage... C'était un coeur" fi elif [[ $level == 2 ]]; then if [[ $1 == "astronaute" ]]; then echo "Bien joué, c'était bien un astronaute!" else echo "Dommage... C'était un astronaute" fi elif [[ $level == 3 ]]; then if [[ $1 == "pikachu" ]]; then echo "Bien joué, c'était bien un pikachu!" else echo "Dommage... C'était un pikachu" fi fi } continu="y" echo "Salut, quel est ton nom?" read nom echo "Enchanté $nom !" echo "ça te dirais de parler un peu? (y/n)" read rep1 if [[ "$rep1" != "y" && "$rep1" != "n" ]]; then while [[ "$rep1" != "y" && "$rep1" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read rep1 done fi if [[ "$rep1" == y ]]; then while [[ "$continu" == y ]] do echo -e "Cool! Que veux-tu faire?\nParler du temps dehors? (time)\nParler du développement Linux? (dev)\nOu préfères-tu jouer à un jeu? (game)" read rep2 if [[ "$rep2" != "time" && "$rep2" != "dev" && "$rep2" != "game" ]];then while [[ "$rep2" != "time" && "$rep2" != "dev" && "$rep2" != "game" ]] do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-time\n-dev\n-game" read rep2 done fi if [[ "$rep2" == "time" ]]; then echo "Il fait beau aujourd'hui, tu ne trouves pas? (y/n)" read rep3 if [[ "$rep3" != "y" && "$rep3" != "n" ]]; then while [[ "$rep3" != "y" && "$rep3" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read rep3 done fi if [[ "$rep3" == "y" ]]; then echo "J'adore le soleil! On parle d'autre chose? (y/n)" read continu2 if [[ "$continu2" != "y" && "$continu2" != "n" ]]; then while [[ "$continu2" != "y" && "$continu2" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read continu2 done fi continu="$continu2" elif [[ "$rep3" == "n" ]]; then echo "Oui, tu as raison... Il y a quelques nuages. On parle d'autre chose? (y/n)" read continu2 if [[ "$continu2" != "y" && "$continu2" != "n" ]]; then while [[ "$continu2" != "y" && "$continu2" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read continu2 done fi continu="$continu2" fi elif [[ "$rep2" == dev ]]; then echo "Le développement Linux est une matière de la Prep'ISIMA où l'on apprend énormement de choses sur l'informatique. Mais attention, il y a beaucoup de travail!" echo "Veux-tu parler d'autre chose? (y/n)" read continu2 if [[ "$continu2" != "y" && "$continu2" != "n" ]]; then while [[ "$continu2" != "y" && "$continu2" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read continu2 done fi continu="$continu2" elif [[ "$rep2" == "game" ]]; then echo -e "A quel jeu veux-tu jouer?\n\n-pictionary (draw)\n-lancer de dès (dice)" read rep4 if [[ "$rep4" != "draw" && "$rep4" != "dice" ]]; then while [[ "$rep4" != "draw" && "$rep4" != "dice" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-draw\n-dice" read rep4 done fi if [[ "$rep4" == "dice" ]]; then echo -e "Choisi un niveau:\n\n ---------\n (1) |Level 1|\n ---------\n\n ---------\n (2) |Level 2|\n ---------\n\n ---------\n (3) |Level 3|\n ---------\n\n" read lvl if [[ $lvl != 1 && $lvl != 2 && $lvl != 3 ]]; then while [[ $lvl != 1 && $lvl != 2 && $lvl != 3 ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-1\n-2\n-3" read lvl done fi dicelevel $lvl echo "Choisi un nombre entre 1 et $rand1" read nbdice if [[ $nbdice -lt 1 || $nbdice -gt $rand1 ]]; then while [[ $nbdice -lt 1 || $nbdice -gt $rand1 ]]; do echo -e "Ce nombre n'est pas compris entre 1 et $rand1, choisi en un autre" read nbdice done fi dice $nbdice $rand1 elif [[ "$rep4" == "draw" ]]; then echo -e "Les règles de ce jeu sont simples:\nTu dois deviner ce que représente l'image donnée. Ta réponse devra être écrite en minuscule et contenir un unique mot clé.\n\n" draw echo -e "\n\n Que représente ce dessin?" read devine drawverif $devine fi echo "Veux-tu faire autre chose? (y/n)" read continu2 if [[ "$continu2" != "y" && "$continu2" != "n" ]]; then while [[ "$continu2" != "y" && "$continu2" != "n" ]]; do echo -e "Pardon, mais je n'ai pas compris, choisi bien une des optons précisées entre parenthèse\n-y\n-n" read continu2 done fi continu="$continu2" fi done elif [[ "$rep1" == n ]]; then echo "Ah... Dommage, alors à bientot!" fi
Exemple d’utilisation
Voici ci dessous plusieurs exemples de résultats que peut fournir le script.
Un premier exemple avec la discussion sur le développement Linux:
Un second exemple avec l’utilisation de la fonction dice:
Un troisième exemple avec l’utilisation de la fonction draw:
Conclusion
Ce travail sur les script m’a permi d’en apprendre plus sur le langage Bash, et de développer mes compétences dans ce même langage. De plus, le fait de devoir créer le script de mon choix m’a beaucoup plu, car cela a rendu le travail plus ludique et m’a permi d’explorer les nombreuses possibilitées du bash.