Ceci est une ancienne révision du document !
Table des matières
BASH
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
Variables
Variables utiles pour le statut d'un processus
- Pour afficher le PID du dernier processus lancé en tâche de fond : echo $!
- Pour afficher le code retour de la dernière commande: echo $?
Variables utiles dans un script
- Pour afficher le nom du script dans le script : echo $0
- Pour afficher le premier argument du script : echo $1, le second : echo $2 etc…
- Pour afficher tous les arguments : echo $@
- Pour afficher le nombre de paramètres : echo $#
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
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
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
