Rapport sur les scripts Bash

Table of Contents

Lien vers ma page web ISIMA

bashlogo.png

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.

invitebash.png

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:

bashex1.png

Un second exemple avec l’utilisation de la fonction dice:

bashex2.png

Un troisième exemple avec l’utilisation de la fonction draw:

bashex3.png

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.

Author: Mathieu CHEDAS

Created: 2023-03-20 lun. 13:55