Table des matières

BASH

Variables

Variables utiles pour le statut d'un processus

Variables utiles dans un script

Expansion des variables

Compter le nombre de caractères dans la variable

user@host# VAR=nombredecaracteres
user@host# echo ${#VAR}
18

Substituer les caractères à la fin de la variable

user@host# VAR=mavariable
user@host# echo ${VAR#ma}
variable

Substituer les caractères du début de la variable

user@host# VAR=mavariable
user@host# echo ${VAR%ble}
mavaria

Pour effacer tout ce qui est derrière “:” :

user@host# VAR=user:password
user@host# echo ${VAR%:*}
user

Pour effacer tout ce qui est devant “:” :

user@host# VAR=user:password
user@host# echo ${VAR#*:}
password

Définir une valeur par défaut à VAR en cas d'absence de valeur. Si VAR=““ alors VAR=defaut :

user@host# VAR=
user@host# echo ${VAR:=defaut}
defaut

Opérateurs

Les opérateurs sont très utiles pour la création de scripts shell.

if

for

Description

for permet d'effectuer une ou un ensemble d'actions avec comme variable une liste d'élements.

Création du script

Ici on cré un script for.sh

for i in chien chat souris
do
  echo ${i}
done

Résultat

Le lancement de for.sh donnera le resultat suivant

chien
chat
souris

case

Description

case permet d'effectuer un ensemble d'action en fonction d'un parametre donné

Création d'un script

On cré le script case.sh

case $1 in
  a) echo "choix: a";;
  b) echo "choix: b";;
  *) echo "choix non valide";;
esac

Résultat

Le lancement de case.sh a affichera

choix: a

Le lancement de case.sh b affichera

choix: b

Par contre si le choix a ou b n'est pas précisé. case.sh -d ou case.sh afficheront:

choix non valide

while

Description

while permet de lancer un ensemble de commandes en boucle jusque ce qu'une certaine condition soit atteinte.

Création d'un script

On va créer un script while.sh qui boucle tant que la variable test n'est pas égale à 4 test=1

while [ $test != 4 ]
do
  echo $test
  test=$(($test + 1))
done

Le lancement du script while.sh donnera le résultat suivant:

1
2
3

Surveillance d'un processus toute les 20s avec 1800 itérations:

freq=20
iteration=1800
VAR=1
while [ ${VAR} -le ${iteration} ]
do
  echo $(date +%H:%M:%S)";"$(top -b -n 1 -u process) >> file.txt
  VAR=$(expr $VAR + 1)
  sleep ${freq}
done

read

function

getopts

Description

getopts permet de positionner des options dans un script

Création du script

Step 1

On va créer le script getopts.sh il permettra d'ajouter les options -a ou -b à notre script lorsqu'on le lance. Si une des options est indiquées le script affichera option X

getopts ab opt
if [ $opt = "a" ]
then
  echo "option a"
fi
if [ $opt = "b" ]
then
  echo "option b"
fi

lancement du script: getopts -a

Résultat:

option -a

lancement du script: getopts -b

Résultat:

option -b

lancement du script: getopts -b -a

Résultat:

option -b

:!: Vous remarquerez que notre script ne peut pas cumuler les options -a et -b

Step 2

On va donc perfectionner notre script getopts.sh en ajoutant un while ainsi les options -a et -b pour être cumulées

while getopts "ab" opt;
do
if [ $opt = "a" ]
then
  echo "option a"
fi
if [ $opt = "b" ]
then
  echo "option b"
fi
done

lancement du script: getopts -b -a

Résultat:

option -a
option -b
Step 3

Maintenant on aimerait associer une valeur à l'option -a. il suffit d'ajouter : derrière le a et on récupère la valeur par $OPTARG

while getopts "a:b" opt;
do
if [ $opt = "a" ]
then
  echo "option a avec mon parametre $OPTARG"
fi
if [ $opt = "b" ]
then
  echo "option b"
fi
done

lancement du script: getop.sh -b -a coucou

Résultat:

option b
option a avec mon parametre coucou
Step 4

Maintenant on va faire le même script qu'avant mais on utilise case à la place de if ce qui sera beaucoup plus clair

while getopts "a:b" opt
do
  case $opt in
    a) echo "option a avec mon parametre $OPTARG";;
    b) echo "option b";;
  esac
done

lancement du script: getop.sh -b -a coucou

Résultat:

option b
option a avec mon parametre coucou

Quelques astuces

Configurer le prompt

Pour avoir des couleurs sur le prompt de bash, éditer le fichier $HOME/.bashrc puis ajouter par exemple la ligne suivante

PS1='\e[1;34m[ \e[0m\u @ \e[1;34m\h\e[0m \e[1;40m\w\e[0m\e[1;34m ]\n\$\e[0m '

Modifier les “34m” “40m” etc… pour changer de couleur

Pour le monochrome :

PS1='\[[ \u@\h \w \]]\n\$ '

Pour afficher des couleurs plus lisibles dans la console

Pour éviter les couleurs illisibles lorsque l'on lance la commande ls ajouter la ligne suivante dans /etc/bashrc

unset LS_COLORS

Pour débugger un script Shell

En début de script insérer la commande suivante pour le rendre verbeux :

set -x

Pour le faire sur une partie du script uniquement :

set -x
<instruction>
set +x

Fonction pour afficher des messages en couleur

# Affiche un message en rouge
echo_red() {
    echo $(printf '\033[%sm%s\033[m\n' "31" $1)
}
# Affiche un message en vert
echo_green() {
    echo $(printf '\033[%sm%s\033[m\n' "32" $1)
}

# Utiliser les fonctions echo_red ou echo_green selon la couleur voulue a la place du echo
echo_red "Error"
echo_green "OK"

Historique des commandes

Pour configurer l'historique des commandes préfixé de la date :

Définir la variable HISTTIMEFORMAT ainsi dans un fichier de profile. Par exemple :

echo "HISTTIMEFORMAT='%d/%m/%Y %H:%M '" >> /etc/profile.d/history.sh
chmod +x /etc/profile.d/history.sh

ou sous Debian :

echo "HISTTIMEFORMAT='%d/%m/%Y %H:%M '" >> /etc/profile

ou bien pour un seul utilisateur :

echo "HISTTIMEFORMAT='%d/%m/%Y %H:%M '" >> $HOME/.bashrc

Pour connaître l'historique des commandes, taper :

history