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
Les opérateurs sont très utiles pour la création de scripts shell.
for
permet d'effectuer une ou un ensemble d'actions avec comme variable une liste d'élements.
Ici on cré un script for.sh
for i in chien chat souris do echo ${i} done
Le lancement de for.sh
donnera le resultat suivant
chien chat souris
case
permet d'effectuer un ensemble d'action en fonction d'un parametre donné
On cré le script case.sh
case $1 in a) echo "choix: a";; b) echo "choix: b";; *) echo "choix non valide";; esac
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
permet de lancer un ensemble de commandes en boucle jusque ce qu'une certaine condition soit atteinte.
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
getopts
permet de positionner des options dans un script
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
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
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
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
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 éviter les couleurs illisibles lorsque l'on lance la commande ls
ajouter la ligne suivante dans /etc/bashrc
unset LS_COLORS
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
# 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"
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