====== BASH ====== ===== 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 ===== 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 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