Scripts et Programmation

BASH - Mémo pour scripter

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



Je script, je script, mais parfois, j'ai un sacré trou de mémoire ... et je galère à trouver ce que je cherche sur Internet.
Comment on incrémente une variable ? Comment on fait un SI, un POUR ?
Et bien la réponse se trouve ci-dessous !

Les variables



Affectation de variable



Pour mettre dans la variable a la valeur chaîne toto :
Code BASH :
a="toto"

De la même façon, on peut mettre dans des variables des nombres :
Code BASH :
b=2

Pour utiliser ces variables, ajouter un $ devant :
Code BASH :
echo $a
toto

On peut mettre dans une variable le résultat d'une commande shell en encadrant la commande dans $() :
Code BASH :
$ ls -l /etc | wc -l
342
nb=$(ls -l /etc | wc -l)
echo $nb
342
 


Calculs



Calculs simples



Grosso-modo, pour faire des calculs simples, on utilise la syntaxe suivante :
Code BASH :
$((calcul))

On peut affecter ce calcul à une variable :
Code BASH :
a=$((calcul))

Ou bien l'afficher :
Code BASH :
echo $((calcul))

Si on veut faire une addition :
Code BASH :
echo $((21+21))
42

Si on veut faire une soustraction :
Code BASH :
echo $((63-21))
42

Si on veut faire une multiplication :
Code BASH :
echo $((2*21))
42

Si on veut faire une division :
Code BASH :
echo $((84/2))
42

On peut évidemment utiliser des variables dans le calcul :
Code BASH :
i=42
echo $(($i*2))
84


Incrémenter et décrémenter



Pour incrémenter ou décrémenter, on peut utiliser la fonction let :
Code BASH :
i=42
let i--
echo $i
41

Code BASH :
let i++
echo $i
42

Les structures conditionnelles : If



Le test "Si'" est généralement fait ainsi :
Code BASH :
if condition
then
    commande 1
    commande2
fi

Pour les exemples, nous avons besoin d'opérateurs de comparaison, voir ci-dessous.

Les opérateurs de comparaison



Comparaison d'entiers



-eq : est égal à
Code BASH :
if [ "$a" -eq "$b" ]

-ne : n'est pas égal à
Code BASH :
if [ "$a" -ne "$b" ]

-gt : est plus grand que
Code BASH :
if ["$a" -gt "$b" ]

-ge : est plus grand ou égal à
Code BASH :
if [ "$a" -ge "$b" ]

-lt : est plus petit que
Code BASH :
if [ "$a" -lt "$b" ]

-le : est plus petit ou égal à
Code BASH :
if [ "$a" -le "$b" ]

Comparaison de chaînes



== : est égal à
Code BASH :
if [ "$a" == "$b" ]

!= : n'est pas égal à
Code BASH :
if [ "$a" != "$b" ]

-z string : Vrai si la longueur de la chaîne est égale à 0 (variable non initialisée)
Code BASH :
if [ -z "$var" ]

=~ : match avec une regexp (exemple, si ça commence par un # :
Code BASH :
if [ "$a" != ^# ]

Les tests sur les chaines



-z $var : Vrai si la taille de la chaîne est zéro (variable non utilisée ou vide)
Code BASH :
if [ -z $var ]

-n $var : Vrai si la taille de la chaîne est différente de zéro (variable utilisée et non vide)
Code BASH :
if [ -n $var ]


Les tests sur les fichiers



-e file : Vrai si le fichier existe
Code BASH :
if [ -e /tmp/fichier ]

-d file : Vrai si le fichier existe et que c'est un répertoire
Code BASH :
if [ -d /tmp/dossier ]

-f file : Vrai si le fichier existe et que c'est un fichier ordinaire
Code BASH :
if [ -f /tmp/fichier ]

-h file : Vrai si le fichier existe et que c'est un lien symbolique
Code BASH :
if [ -h /tmp/lien ]

-r file : Vrai si le fichier possède les droits de lecture
Code BASH :
if [ -r /tmp/fichier ]

-s file : Vrai si le fichier a une taille non nulle
Code BASH :
if [ -s /tmp/fichier ]

-w file : Vrai si le fichier possède les droits d'écriture
Code BASH :
if [ -w /tmp/fichier ]

-x file : Vrai si le fichier possède les droits d'exécution
Code BASH :
if [ -x /tmp/fichier ]

-O file : Vrai si le possesseur est identique à celui qui exécute le test
Code BASH :
if [ -O /tmp/fichier ]

-G file : Vrai si le possesseur qui exécute le test fait partie du groupe du fichier
Code BASH :
if [ -G /tmp/fichier ]

-N file : Vrai si le fichier existe et qu'il a été modifié depuis sa dernière lecture
Code BASH :
if [ -N /tmp/fichier ]


Comparaison de fichiers



file1 -nt file2 : Vrai si le file1 est plus récent que file2 (date de modification) ou si file1 existe et pas file2
Code BASH :
if [ file1 -nt file2 ]

file1 -ot file2 : Vrai si file1 est plus ancien que file2 ou que file2 existe et pas file1
Code BASH :
if [ file1 -ot file2 ]


La négation (inverser le test)



Le symbole de négation est !.
Si on teste de cette façon su un dossier existe :
Code BASH :
if [ -d "$DIR" ]

Et bien tester s'il existe pas se fera ainsi :
Code BASH :
if [ ! -d "$DIR" ]

Et Ou



Si vous voulez combiner des tests (le ET ou bien le OU) c'est avec -a et -o :
Pour le ET :
Code BASH :
if ["$a" -gt "$b" -a "$c" -gt "$d"]

Pour le OU :
Code BASH :
if ["$a" -gt "$b" -o "$c" -gt "$d"]


Les structures conditionnelles Partie 2



For



Pour le for ce n'est pas très compliqué :
Code BASH :
for i in 1 2 3 4 5
do
    echo $i
    commande1
    commande2
    commandeN
done

On peut traiter avec une commande aussi, par exemple la boucle ci-dessus peut être écrite en utilisant la commande seq :
Code BASH :
for i in $(seq 1 5)
do
    echo $i
    commande1
    commande2
    commandeN
done

Et on peut aussi utiliser des chaines de caractère :
Code BASH :
for f in fic1 fic2 fic3
do
    echo "On affiche le fichier $f"
    cat $f
done

Pour la boucle infinie, utiliser ceci (fin de la boucle avec break) ou CTRL+C :
Code BASH :
for (( ; ; ))
do
   echo "boucle infinie"
done


While



De manière générale, la syntaxe est la suivante :
Code BASH :
while [ condition ]
do
   commande1
   commande2
   commande3
done

Voici un exemple :
Code BASH :
x=1
while [ $x -le 5 ]
do
  echo "Passage numéro $i"
  x=$(($x+1))
done

La boucle infinie se traduit ainsi :
Code BASH :
while :
do
    echo "boucle infinie"
done

La boucle infinie peut s’interrompre avec break :
Code BASH :
while :
do
    read -p "Entrer un chiffre ( -1 pour quitter ) : " a
    if [ $a -eq -1 ]
    then
        break
    fi
    echo "Vous avez saisi $a"
done


Des petits trucs marrants



Lire un fichier ligne par ligne



Pour lire les lignes d'un fichier :

Code BASH :
while read ligne
do
    echo  "$ligne"
done < fichier


Si on veut lire un fichier avec des lignes avec un séparateur (exemple passwd, qui a le séparateur : ) on peut stocker direct dans les variables

Code BASH :
while IFS=: read user pass uid gid nom dossperso shell
do
   echo  "$user avec UID $uid a son home dans $dossperso
done < /etc/passwd