« Bash » : différence entre les versions

De Justine's wiki
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 202 : Ligne 202 :
if [ -d $rep ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Bravo!"<br/> else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Mais nooooon..."<br/> fi
if [ -d $rep ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Bravo!"<br/> else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Mais nooooon..."<br/> fi
</div>  
</div>  
&nbsp;
&nbsp;


Ligne 221 : Ligne 220 :
&nbsp;
&nbsp;


&nbsp;
== Tester plusieurs conditions à la fois avec case ==
 
case est plus simple à utiliser lorsque l'on veut faire beaucoup de tests sur une variable qu'un gros bloc de elif. Son usage est le suivant :
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px"><pre class="hoveredCourseElement" data-claire-element-id="2589802" id="r-2284655">#!/bin/bash


case&nbsp;$1&nbsp;in #On veut analyser la variable $1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bruno") #On teste une valeur; j'aurais pu mettre B* pour tester tout ce qui commence par B
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo&nbsp;"Salut&nbsp;Bruno&nbsp;!" 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; #Si la condition est vraie, tout ce qui va jusqu'au ;; est exécuté.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Michel")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Bien&nbsp;le&nbsp;bonjour&nbsp;Michel"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Jean")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Hé&nbsp;Jean,&nbsp;ça&nbsp;va&nbsp;?"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*)          #Équivalent d'un else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo&nbsp;"J'te&nbsp;connais&nbsp;pas,&nbsp;ouste&nbsp;!"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
esac    #Fin du case</pre>
</div>
&nbsp;
&nbsp;


&nbsp;
Attention : le ;; dit à bash d'arrêter la lecture du case : il saute alors directement au esac. On peut aussi faire des ou dans un case, pas avec&nbsp; || mais avec | :
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px"><pre class="hoveredCourseElement" data-claire-element-id="2589816" id="r-2284669">#!/bin/bash


case&nbsp;$1&nbsp;in
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Chien"&nbsp;|&nbsp;"Chat"&nbsp;|&nbsp;"Souris")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"C'est&nbsp;un&nbsp;mammifère"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Moineau"&nbsp;|&nbsp;"Pigeon")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"C'est&nbsp;un&nbsp;oiseau"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Je&nbsp;ne&nbsp;sais&nbsp;pas&nbsp;ce&nbsp;que&nbsp;c'est"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
esac</pre>
</div>
&nbsp;
&nbsp;



Version du 10 novembre 2018 à 23:37

Utilisation et syntaxe de scripts bash

Un script bash commence par #!/bin/bash (commentaire spécial) pour indiquer quel interpréteur de commandes utiliser. Il a par convention l'extension de fichier .sh.

Je peux le rendre exécutable avec chmod +x

Pour que mon script soit exécuté sans que j'ai besoin d'indiquer son chemin, il faut le placer dans un des répertoires qui sont stockés dans la variable système PATH, qui recense les lieux où se trouvent les exécutables. Je peux afficher son contenu par un echo $PATH

Les commentaires sont précédés de #

Variables

Une variable se déclare comme suit :

nom='variable'

Attention : Pas d'espaces autour du =. Un apostrophe peut être inséré dans la variable par un \, un retour de chariot avec \n. Et pour afficher une variable, on utilise echo $variable (avec l'option -e pour utiliser des \n). Cependant, on ne peut pas utiliser $variable dans des quotes ' '. Il existe plusieurs types de quotes:

  • Les apostrophes ' : la variable n'est pas analysée et affichée comme telle
  • Les guillemets " : la variable est analysée et son contenu est affiché; bash cherche des symboles spéciaux et les interprète.
  • Les back quotes ` (AltGr + 7) : bash exécute ce qu'il trouve; les back quotes s'utilisent à la création de la variable : variable=`commande`

La saisie utilisateur se fait avec la commande read.

  • read nom : on affiche rien, on attend juste que l'utilisateur entre une valeur
  • read nom prenom : on enregistre dans deux variables, avec deux valeurs attendues, si l'utilisateur donne plus, tout ce qui reste va dans la dernière variable.
  • read -p 'Entrez une valeur' variable : On affiche un prompt, pour indiquer à l'utilisateur ce que l'on attend
  • read -n 10 nom : On limite à 10 caractères. L'entrée s'arrête d'elle même arrivée à 10 caractères.
  • read -t 10 variable : on limite le temps donné pour entrer la valeur (temps en secondes)
  • read -s variable : on affiche pas le texte saisi par l'utilisateur

Variables d'environnement

Aussi appelées variables globales, une fois définies, elles sont disponibles dans tout le système. On peut les lister avec env. Certaines parmi les plus utiles sont :

  •  

SHELL : indique quel type de shell est en cours d'utilisation (sh, bash, ksh…) ;

  •  

PATH : une liste des répertoires qui contiennent des exécutables que vous souhaitez pouvoir lancer sans indiquer leur répertoire. Nous en avons parlé un peu plus tôt. Si un programme se trouve dans un de ces dossiers, vous pourrez l'invoquer quel que soit le dossier dans lequel vous vous trouvez ;

  •  

EDITOR : l'éditeur de texte par défaut qui s'ouvre lorsque cela est nécessaire ;

  •  

HOME : la position de votre dossier home ;

  •  

PWD : le dossier dans lequel vous vous trouvez ;

  •  

OLDPWD : le dossier dans lequel vous vous trouviez auparavant.

On peut les appeller dans notre script en utilisant leur nom :

echo "$HOME est votre dossier home!"

On peut en définir avec la commande export.

Variables des paramètres

Un script bash peut accepter des paramètres, données lorsque on l'appelle: ./script parametre1 parametre2

On peut y accéder via des variables qui sont crées automatiquement:

  • $# : contient le nombre de paramètres
  • $0 : contient le nom du script
  • $1 : contient le premier paramètre
  • ...
  • $9 : contient le neuvième paramètre

Si on a plus de 9 paramètres, on utilise la commande shift. Après un usage de shift, le paramètre 1 prend la valeur du paramètre 2 , le 2 prend la valeur du 3, etc. On pourra utiliser shift dans une boucle et traiter les paramètres un par un.

Les tableaux

Comme une liste en python, un tableau contient plusieurs cases. On l'initialise comme suit :

tableau=('valeur0' 'valeur1' 'valeur2')

Pour accéder à une des "cases" du tableau, on fait comme ça:

${tableau[2]}  #Affiche la valeur de la case 2, sachant qu'on compte comme d'habitude à partir de 0

${tableau[*]}   #Affiche toutes les cases

On peut initialiser une case comme suit:

tableau[2]='valeur'

 

Opérations mathématiques

Bash traite toutes les variables comme des string, par défaut. Il faut utiliser la commande let pour faire des calculs:

  • let "a = 5"
  • let "b = 2"
  • let "c = a + b"
  • echo $c #renverra 7

Les opérations disponibles :

  • + addition
  • - soustraction
    • multiplication
  • / division
      • puissance
  • % modulo

On peut aussi contracter les commandes comme en python : let "a = a * 3" est équivalent à let "a *= 3".

let ne gère que les entiers, les décimaux sont gérés par la commande bc.

 

Conditions

If - then - else

La condition if - then - else en bash se fait sous la forme :

if [ condition ]
then
        echo "C'est vrai"

else
        echo "C'est faux"
fi

! : [ condition ] et pas [condition]

Une condition se vérifie avec = et pas ==

Tout ce qui est entre then et fi est exécuté. Par exemple:

  1. !/bin/bash

read -p 'Dites bonjour' reponse

if [ $reponse = 'bonjour' ]
then
        echo 'bonjour!'
else
        echo 'Au revoir!'
fi

On peut tester ce que l'on veut, y compris un paramètre; mais le script fonctionnera mal si on n'appelle pas de paramètre avec le script (il faudrait vérifier au préalable qu'il y'en a dans un autre if).

Elif

La condition elif existe aussi:

  1. !/bin/bash


if [ $1 = 'camion' ]
then
        echo 'Tut Tut!'
elif [ $1 = 'moto' ]
then
        echo 'Vroum Vroum!'
elif [ $1 = 'voiture' ]
then
        echo 'vrouuuuuuuuuum...'
else
        echo 'Fallait dire camion...'
fi

Tests

On peut effectuer trois types de tests:

  • Sur des fichiers
  • Sur des nombres,
  • Sur des string.

Tests de string

  • $chaine1 = $chaine2 : Les string sont-ils identiques?
  • $chaine1 != $chaine2 : Les string sont-ils différents?
  • -z $chaine : La chaîne est elle vide?
  • -n $chaine : la chaîne est-elle non-vide?

Une variable non définie est considérée comme vide; cela vaut aussi pour les paramètres.

Tests de nombres:

On peut faire des tests sur des nombres, si une variable en contient (même si bash traite toutes les variables comme des string en interne !). Ici 1 correspond à $variable1 et 2 correspond $variable2 (la flemme).

  • 1 -eq 2 : Teste l'égalité des nombres, à ne pas confondre avec = utilisé pour les string.
  • 1 -ne 2 : Teste si les chiffre sont différents (Not Equal), à ne pas confondre avec != pour les string
  • 1 -lt 2 : Teste si 1 est plus petit que 2 (Lesser Than)
  • 1 -le 2 : Teste si 1 est inférieur ou égal à 2 (Lesser or Equal)
  • 1 -gt 2  : Teste si 1 est plus grand que 2 (Greater Than)
  • 1 -ge 2 : Teste si 1 est supérieur ou égal à 2 (Greater or Equal)

Tests de fichiers

On peut tester des fichiers, à condition d'avoir leur chemin absolu ou relatif, qui peut être dans une variable. Ici f correspond à $fichier (re-flemme).

  • -e f : Teste si le fichier existe
  • -d f : vérifie si le fichier est un répertoire
  • -f f : vérifie si le fichier est un fichier
  • -L f : vérifie si le fichier est un lien symbolique
  • -r f : vérifie sir le fichier est lisible
  • -w f : vérifie si le fichier est modifiable
  • -x f : vérifie si le fichier est exécutable
  • f1 -nt f2 : vérifie si f1 est plus récent (Newer Than) que f2
  • f1 -ot f2 : vérifie si f1 est plus vieux (Older Than) que f2

Exemple:

  1. !/bin/bash

read -p 'Entrez le nom d\un répertoire : ' rep

if [ -d $rep ]
then
        echo "Bravo!"
else
        echo "Mais nooooon..."
fi

 

Faire des AND et des OR et des NOT

Un AND se fait avec &&

Un OR se fait avec ||

Un NOT se fait plus ou moins avec un ! à mettre avant le test à inverser. (On inverse le test, un ! variable != 'valeur' équivaut à un test d'égalité)

Exemple:

  1. !/bin/bash

if [ $# -gt 0 ] && [ $1 = 'écureuil' ] && [ ! $1 = 'hibou' ]
then
        echo "ACCESS GRANTED"
else
        echo "ACCESS DENIED"
fi

 

Tester plusieurs conditions à la fois avec case

case est plus simple à utiliser lorsque l'on veut faire beaucoup de tests sur une variable qu'un gros bloc de elif. Son usage est le suivant :

#!/bin/bash

case $1 in #On veut analyser la variable $1
        "Bruno") #On teste une valeur; j'aurais pu mettre B* pour tester tout ce qui commence par B
                echo "Salut Bruno !"  
                ;; #Si la condition est vraie, tout ce qui va jusqu'au ;; est exécuté.
        "Michel")
                echo "Bien le bonjour Michel"
                ;;
        "Jean")
                echo "Hé Jean, ça va ?"
                ;;
        *)          #Équivalent d'un else
                echo "J'te connais pas, ouste !"
                ;;
esac    #Fin du case

 

Attention : le ;; dit à bash d'arrêter la lecture du case : il saute alors directement au esac. On peut aussi faire des ou dans un case, pas avec  || mais avec | :

#!/bin/bash

case $1 in
        "Chien" | "Chat" | "Souris")
                echo "C'est un mammifère"
                ;;
        "Moineau" | "Pigeon")
                echo "C'est un oiseau"
                ;;
        *)
                echo "Je ne sais pas ce que c'est"
                ;;
esac