« Bash » : différence entre les versions

De Justine's wiki
Aller à la navigation Aller à la recherche
(Page créée avec « = 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 pa... »)
 
Aucun résumé des modifications
Ligne 12 : Ligne 12 :
== Variables ==
== Variables ==


Une variable se déclare comme suit :
Une variable se déclare comme suit :


nom='variable'
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:
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 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 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`  
*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.
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 : 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 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 -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 -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 -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  
*read -s variable : on affiche pas le texte saisi par l'utilisateur  


== Variables d'environnement ==
== 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 :
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 :
 
* 


*
<code data-claire-semantic="text">SHELL</code>&nbsp;: indique quel type de shell est en cours d'utilisation (sh, bash, ksh…)&nbsp;;
<code data-claire-semantic="text">SHELL</code>&nbsp;: indique quel type de shell est en cours d'utilisation (sh, bash, ksh…)&nbsp;;


*
*&nbsp;
 
<code data-claire-semantic="text">PATH</code>&nbsp;: 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&nbsp;;
<code data-claire-semantic="text">PATH</code>&nbsp;: 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&nbsp;;


*
*&nbsp;
 
<code data-claire-semantic="text">EDITOR</code>&nbsp;: l'éditeur de texte par défaut qui s'ouvre lorsque cela est nécessaire&nbsp;;
<code data-claire-semantic="text">EDITOR</code>&nbsp;: l'éditeur de texte par défaut qui s'ouvre lorsque cela est nécessaire&nbsp;;


*
*&nbsp;
 
<code data-claire-semantic="text">HOME</code>&nbsp;: la position de votre dossier <code data-claire-semantic="text">home</code>&nbsp;;
<code data-claire-semantic="text">HOME</code>&nbsp;: la position de votre dossier <code data-claire-semantic="text">home</code>&nbsp;;


*
*&nbsp;
 
<code data-claire-semantic="text">PWD</code>&nbsp;: le dossier dans lequel vous vous trouvez&nbsp;;
<code data-claire-semantic="text">PWD</code>&nbsp;: le dossier dans lequel vous vous trouvez&nbsp;;


*
*&nbsp;
 
<code data-claire-semantic="text">OLDPWD</code>&nbsp;: le dossier dans lequel vous vous trouviez auparavant.
<code data-claire-semantic="text">OLDPWD</code>&nbsp;: le dossier dans lequel vous vous trouviez auparavant.


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


echo "$HOME est votre dossier home!"
echo "$HOME est votre dossier home!"
Ligne 66 : Ligne 71 :
On peut y accéder via des variables qui sont crées automatiquement:
On peut y accéder via des variables qui sont crées automatiquement:


*$# : contient le nombre de paramètres  
*$#&nbsp;: contient le nombre de paramètres  
*$0 : contient le nom du script  
*$0&nbsp;: contient le nom du script  
*$1 : contient le premier paramètre  
*$1&nbsp;: contient le premier paramètre  
*...  
*...  
*$9 : contient le neuvième paramètre  
*$9&nbsp;: 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.
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.
Ligne 76 : Ligne 81 :
== Les tableaux ==
== Les tableaux ==


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


tableau=('valeur0' 'valeur1' 'valeur2')
tableau=('valeur0' 'valeur1' 'valeur2')
Ligne 101 : Ligne 106 :
*echo $c #renverra 7  
*echo $c #renverra 7  


Les opérations disponibles :
Les opérations disponibles&nbsp;:


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


On peut aussi contracter les commandes comme en python : let "a = a * 3" est équivalent à let "a *= 3".
On peut aussi contracter les commandes comme en python&nbsp;: 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.
let ne gère que les entiers, les décimaux sont gérés par la commande bc.
&nbsp;
= Conditions =
== If - then - else ==
La condition if - then - else en bash se fait sous la forme&nbsp;:
<code>if [ condition ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "C'est vrai"</code><br/> <code>else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "C'est faux"<br/> fi</code>
<blockquote>
!&nbsp;: [ condition ] et pas [condition]
Une condition se vérifie avec = et pas ==
</blockquote>
Tout ce qui est entre then et fi est exécuté. Par exemple:
<div style="background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px">
#!/bin/bash
read -p 'Dites bonjour' reponse
if [ $reponse = 'bonjour' ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'bonjour!'<br/> else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Au revoir!'<br/> fi
</div>
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:
<div style="background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px">
#!/bin/bash
<br/> if [ $1 = 'camion' ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Tut Tut!'<br/> elif [ $1 = 'moto' ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Vroum Vroum!'<br/> elif [ $1 = 'voiture' ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'vrouuuuuuuuuum...'<br/> else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo 'Fallait dire camion...'<br/> fi
</div>
== Tests ==
On peut effectuer trois types de tests:
*Sur des fichiers
*Sur des nombres,
*Sur des string.
=== Tests de string ===
*$chaine1 = $chaine2&nbsp;: Les string sont-ils identiques?
*$chaine1&nbsp;!= $chaine2&nbsp;: Les string sont-ils différents?
*-z $chaine&nbsp;: La chaîne est elle vide?
*-n $chaine&nbsp;: la chaîne est-elle non-vide?
<blockquote>
Une variable non définie est considérée comme vide; cela vaut aussi pour les paramètres.
</blockquote>
=== 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&nbsp;!). Ici 1 correspond à $variable1 et 2 correspond $variable2 (la flemme).
*1 -eq 2&nbsp;: Teste l'égalité des nombres, à ne pas confondre avec = utilisé pour les string.
*1 -ne 2&nbsp;: Teste si les chiffre sont différents (Not Equal), à ne pas confondre avec&nbsp;!= pour les string
*1 -lt 2&nbsp;: Teste si 1 est plus petit que 2 (Lesser Than)
*1 -le 2&nbsp;: Teste si 1 est inférieur ou égal à 2 (Lesser or Equal)
*1 -gt 2&nbsp;&nbsp;: Teste si 1 est plus grand que 2 (Greater Than)
*1 -ge 2&nbsp;: 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&nbsp;: Teste si le fichier existe
*-d f&nbsp;: vérifie si le fichier est un répertoire
*-f f&nbsp;: vérifie si le fichier est un fichier
*-L f&nbsp;: vérifie si le fichier est un lien symbolique
*-r f&nbsp;: vérifie sir le fichier est lisible
*-w f&nbsp;: vérifie si le fichier est modifiable
*-x f&nbsp;: vérifie si le fichier est exécutable
*f1 -nt f2&nbsp;: vérifie si f1 est plus récent (Newer Than) que f2
*f1 -ot f2&nbsp;: vérifie si f1 est plus vieux (Older Than) que f2
Exemple:
<div style="background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px">
#!/bin/bash
read -p 'Entrez le nom d\un répertoire&nbsp;: ' rep
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>
=== &nbsp; ===
=== 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&nbsp;! à mettre avant le test à inverser. (On inverse le test, un&nbsp;! variable&nbsp;!= 'valeur' équivaut à un test d'égalité)
Exemple:
<div style="background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px">
#!/bin/bash
if [ $# -gt 0 ] && [ $1 = 'écureuil' ] && [&nbsp;! $1 = 'hibou' ]<br/> then<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "ACCESS GRANTED"<br/> else<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "ACCESS DENIED"<br/> fi
</div>
&nbsp;
&nbsp;
&nbsp;
&nbsp;


&nbsp;
&nbsp;

Version du 7 novembre 2018 à 02:48

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