« Bash » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 261 : | Ligne 261 : | ||
| | ||
== Quelques commandes == | |||
*echo : renvoie du texte sur la sortie standard. | |||
**-e : active les caractères d'échappement | |||
**-n : supprime le retour à la ligne | |||
| |
Version du 19 février 2019 à 11:51
Utilisation et syntaxe de scripts bash
<pdf>Fichier:Abs-guide.pdf</pdf>
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:
- !/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:
- !/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:
- !/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:
- !/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
Quelques commandes
- echo : renvoie du texte sur la sortie standard.
- -e : active les caractères d'échappement
- -n : supprime le retour à la ligne