Mémo d'utilisation de BASH 2 – Exécution : gestion des flux de contrôle et de donnée Utiliser une variable
afficher une variable echo $var ou echo ${var}
Aide mémoire sur les commandes de base Unix et des consoles bash interprétée dans une chaine echo "Voici $var !"
et sh. Seule une utilisation simple et rudimentaire des commandes est Lancer une commande, un processus
initialise une variable si elle n'est pas définie ${var:="toto"}
présentée, pour plus de détails sur une commande, faire : man normal commande rend toto si var n'est pas définie sans l'initialiser ${var:-"toto"}
commande ou commande --help. Attention ' ` et " sont en arrière-plan commande &
en séquence Supprimer une variable
des caractères différents. commande1 ; commande2 ;
IUT de Villetaneuse 2011 grouper les commandes { cmd1;cmd2; } Supprimer une variable unset var
dans un sous shell (cmd1;cmd2;) Visibilité d'une variable
1 - Commandes de base : fichiers et répertoires
(l'environnement est hérité mais pas modifié) Par défaut, une variable est définit dans l'environnement d'exécution
Les opérateur && (et) et || (ou) peuvent être utilisés pour courant. Pour la rendre visible dans tout l'environnement il faut
Changer de répertoire : cd conditionner l'exécution d'une succession de commandes. Le code de utiliser la commande export.
avec une chaine de caractères 1 cd /var/log/ retour d'une commande (contenu dans $?) est vrai s'il vaut 0 et faux dans l'env. (en dehors du sscipt) export var
avec une chaine de caractères 2 cd '/usr/toto/Mes Docs/' sinon. voir aussi: local , env, export, declare, let, set
avec une variable cd $HOME exemple rm dir && echo OK || echo KO Arithmétique sur les entiers
Afficher le contenu d'un répertoire : ls Redirection des entées et sorties standards exemple var=$(( (10 + 12) / 2 ))
affichage simple ls ou ls /var/log/ Un processus Unix possède par défaut une entrée et une sortie exemple var=$[ (10 + 12) / 2 ]
affichage complet ls -al standard et une sortie pour les messages d'erreurs. Les tubes | avec expr var=$(expr \(10 + 12 \) / 2 )
affichage avec motif ls *.txt permettent de rediriger la sortie d'une commande vers l'entrée d'une avec expr 2 var=`expr $var1 - $var2`
autre commande. Variables d'environnement à connaître
Afficher le contenu d'un fichier : cat, more, less, head, tail
mode tube (pipe) commande1 | commande2
affiche tout d'un coup cat fichier Nom de la machine HOSTNAME
redirection de la sortie std commande > [Link]
page par page more fichier Répertoire d'utilisateur HOME
les erreurs vers un fichier commande 2> [Link]
pour les gros fichiers less fichier (on peut aussi utiliser ~ qui est un raccourcit et pas une variable)
rediriger l'entrée commande << "titi toto"
les premières lignes head fichier Nom (login) de l'utilisateur USER
rediriger l'entrée 2 commande < fichier
les deux premières lignes head -n 2 fichier Répertoire courant PWD
affichage des dernières lignes tail /var/log/[Link] Substitutions contient la liste des répertoires où se trouvent les commandes que
Il est possible d'exécuter une commande lors de la création d'une l'utilisateur peut exécuter
Afficher le répertoire courant: pwd PATH
chaine de caractère ou d'une variable.. Par exemple pour afficher contient le nom du shell de connexion SHELL
affichage simple pwd l'heure: echo "Il est `date +%Hh%M`". Taille de l'historique des commandes HISTSIZE
résolution des liens symboliques pwd -P substitution 1 `commande arg1 arg2` l'invite de commande (le prompt) PS1
Déplacer un fichier : mv substitution 2 $(commande arg1 arg2)
vers un répertoire
4 – Manipulation des chaines de caractères
mv fichier /chemin_rep/ Activité, état, terminaison
Il existe différentes manières de définir une chaine de caractère. En
Copier un fichier : cp liste des processus utilisateur ps fonction de la méthode utilisée, les caractères spéciaux ne sont pas
fichier source vers destination cp source destination liste de tous les processus ps -A interprétés de la même manière. Les caractères spéciaux sont:
copie symbolique cp -s source lien liste les processus et leur charge top ", ', `, \, $, !, ?, ~, (), [], {}, @, *...
Suppression de fichier : rm arrêter un processus par son pid kill pid Ils peuvent être protégés par \ ou entre ' ou ".
suppression de plusieurs fichiers rm fichier1 fichier2 ou (SIGKILL) kill -9 pid
arrêter un processus par son nom killall firefox Créer une chaine
avec motif rm *.tmp chaine simple var1=toto\ a\ $var2\ ans
Suppression de répertoire 3 – Opérations sur les variables sans interprétation var1='toto a 10 ans'
suppression d'un répertoire vide rmdir /repertoire/ Pas de typage des variables, un entier peut devenir une chaine de seul $\' et` sont interprétés var1="toto a $var2\$"
du rep. et de son contenu rmdir -r /repertoire/ caractères et inversement. Des entiers, des chaines, mais pas de réel. par évaluation de commande var=`ls .` ou var=$(ls .)
Créer un répertoire Créer une variable Expansion de chaine
création d'un répertoire mkdir mon_rep Créer une variable locale local var taille d'une chaine ${#var}
en lecture seule readonly var=123 Extraire la sous chaine à partir d'une position (ici 5) :${var:5}
Créer un fichier ou declare -r... à partir d'une pos. pour une longueur donnée(ici 10): ${var:5:10}
créer un fichier vide 1 > fichier Créer un entier declare -i var=10 Supprimer la chaîne...
créer un fichier vide 2 touch fichier Créer une chaine de car. var=MonTexte la plus courte à droite (commencent par /*) ${PWD%/*}
créer un fichier par redirection echo "toto" > fichier Créer une chaine de car.2 var="Mon Texte" la plus longue à gauche (ici terminant par */) ${HOME##*/}
test avant création ... créer une chaine de car.3 var='Mon Texte'
fi
5 – Fichier de commande 7 – Structures de contrôle exemple de case:
Pour créer un fichier de commande bash, il suffit d'écrire une Il existe principalement deux techniques de gestion des flux de case $mot in
succession de commandes dans un fichier exte dont l'extension par contrôles. 1) En utilisant le code de retour des commandes (0 = vrai mot1 | mot2 ) echo bien ;;
défaut est .sh, et la première ligne #!/bin/bash. sinon faux) combiné avec les opérateurs && et || entre des mot3) echo super;;
commandes ou groupement de commandes. 2) En utilisant des tests *) echo bof
Arguments esac
Le nombre d'arguments $# entre [ et ] ou entre [[ et ]] ou a l'aide de la commande test,
qui utilisent les opérateurs suivants (entre autres): Boucles
La liste de tous les arguments $* ou $@
Le premier, deuxième, etc, argument $1, $2, etc. Test sur les fichiers (vrai si...) for sur une liste (souvent une substitution de commande)
for i in element1 element2
Le nom du script $0 fichier existe [ -e fichier ]
do
Code de retour de la dernière commande $? fichier est un répertoire [ -d fichier ] echo $i
Le numéro de process de la dernière commande $! done
fichier est lisible [ -r fichier ]
Le numéro de process du shell lui-même $$ for avec itération
Il est possible d'affecter les paramètres d'un script tout en mettant à fichier vous appartient [ -o fichier ] for ((x=0; x <= 10; x++)) ; do
jour les paramètres spéciaux #,* et @ . fichier est exécutable [ -x fichier ] echo $x;
affecter les paramètres $1,$2 ... set toto 21 ...& done
Comparaison de chaine de caractère (vrai si...) while avec test conditionnel sur entier
Fonctions $var est vide [ -z "$var" ] while [ $i -lt 10 ] ; do
Pour déclarer une fonction en bash, on utilise le mot clé function i=$(( $i + 1 ))
$var est non vide [ -n "$var" ]
suivit du nom de la fonction. Le code de la fonction est ensuite echo $i
encadré par { et }: $var égale toto [ "$var" == "toto" ] done
function foo $var diffère de toto [ "$var" != "toto" ] while avec une suite de commande, la suite_de_cmd2 est exécutée
{ tant que suite_de_cmd1 retourne 0;
echo 'Hello World !' $var et avant dans le dico [ "$var" \< "toto" ] while suite_de_cmd1 ; do
} Comparaison arithmétiques (vrai si...) suite_de_cmd2;
Les arguments sont implicitement pris en compte et sont contenus echo $i
$nombre vaut 12 [ $nombre -eq 12 ]
dans des variables $1, $2 etc. done
function foo2 { $nombre est différent de 12 [ $nombre -ne 12 ] 8 – Compression, décompression
echo $1, $2... $nombre inférieur à [ $nombre -lt 12 ]
echo "$# argument(s) : $*." ; } Seul tar et gzip sont intégrés au kernel de base.
invocation d'une fonction foo2 toto 21 titi $nombre inférieur ou égal à [ $nombre -le 12 ] créer une archive tar -cf [Link] source
exporter la déclaration d'une fonction declare -f foo $nombre supérieur à [ $nombre -gt 12 ] désarchiver tar -xf [Link]
compresser tar czvf [Link] source
Sortie, valeur de sortie $nombre supérieur ou égal à [ $nombre -ge 12 ]
désarchiver et décompresser tar xvzf [Link]
Par défaut la valeur de sortie d'un script ($?) est la valeur de retour La notation [[...]] évite le découpage des chaines de caractères (voir aussi gzip, bzip, zip, rar, par etc.)
de la dernière commande. On peut spécifier une autre valeur de possédant des espaces, il n'est plus nécessaire de les protéger avec
sortie avec la commande exit. des ". Aussi, les caractères spéciaux ne sont plus interprétés en tant 9 – Date, time
Spécifier une valeur de sortie exit 12345 qu'extension de chemin mais en motifs de chaine de caractère (voir date style log date +%Y-%m-%d\ %H:%M:%S.%N
6 – Tableaux et dictionnaires les expressions rationnelles) , le caractères < et > n'ont plus à être (%N pas portable sur mac. Posix ?)
protégés par \. = peut être utilisé à la place de == pour une sec. depuis le 01/01/1970 date +%s
Les tableaux (dits tableaux indexés) et dictionnaires (dits associatifs) compatibilité POSIX. date jolie date +%A\ %d\ %B\ %Y\ %Hh%M
fonctionnent de manière similaire, mais un dictionnaire doit exemple avec test test "a" != "$HOME"
obligatoirement être déclaré. 10 – Raccourcis clavier
La notation (( permet les tests sur des opérations arithmétiques.
déclaration d'un tableau declare -a tab (( (var=3*5) == 15 )) && echo $var || echo Non mettre la tache active en arrière plan ctrl + z puis bg
déclaration d'un dico. declare -A dico On peut combiner plusieurs tests en les encadrant avec ( et ) ou/et arrêter un processus (envoi SIGTERM) ctrl + c
initialisation tab=( 8 titi 10 toto ) en utilisant les opérateur -a (pour et) -o (pour ou) … nettoyer l'écran ctrl + l
initialisation 2 tab=([1]=8 [2]=titi) exemple [ -d "$HOME" -a -w "$HOME" ] écrire le caractère de fin de fichier (EOF) ctrl + d
initialisation de dico. dico=([titi]=8 [toto]=rien) exemple [[ (-d $HOME) && (-w $HOME) ]] écrire un code ascii
afficher une valeur echo ${tab[1]} éxecuter la dernière commande commençant par !comm
Tests
afficher une valeur de dico. echo ${dico[titi]} 11 – Référence et liens
taille d'un tableau ${#tab[*]} Exemple de structure de contrôle if:
taille du 2ème élément ${#tab[2]}
if [ $# -gt 1 ] ; then Cours de l'IUT: [Link]
echo OK Site de bash: [Link]
liste des indices définit $tab{!tab[*]} else
afficher un dictionnaire echo ${dico[*]} echo KO