) :Afficher une variable
ou
Obtenir le nombre de caractères d'une variable
-> Renvoie "4" si a="test"
Extraire une sous-chaîne
Il faut utiliser les expressions : ${variable:position} ou ${variable:position:longueur}
-> Renvoie "st" si a="test", car renvoie les X derniers caractères.
-> Renvoie "es" si a="test" car la sous-chaîne commence à 0.
Incrémenter une variable
-> Incrémente la variable i de 1
Parcourir un tableau
liste_elements=("element 1" "élément 2")
for element in ("${liste_elements[@]}")
do
echo "${i}"
done
-> Affiche les 2 éléments du tableau
Substitution de caractères
L'expression suivante peut être utilisée pour remplacer directement des caractères, en recherchant/remplaçant la première occurrence trouvée : ${variable/recherche/remplace}
var="ceci est une valeur"
echo ${var/e/z}
-> Affiche "czci est une valeur"
Pour effectuer plusieurs remplacements, ajouter un second slash après le nom de la variable : ${variable//recherche/remplace}
Modifier la casse d'une variable
Par la substitution, on peut convertir en majuscule une variable : ${variable^^}
Ainsi qu'en minuscules : ${variable,,}
Variables prédéfinies
Il existe des variables déjà prédéfinies par l'interpréteur bash, dont les plus intéressantes sont :
Nom | Description |
$HOME | Répertoire personnel de l'utilisateur |
$PATH | Valeur de la variable d'environnement PATH, qui contient les chemins de recherches |
$$ | PID du processus |
$PPID | PID du processus parent |
$I | PID du processus enfant |
$PWD | Répertoire actuel (peut être différent du répertoire du script) |
$SECONDS | Nombre de secondes écoulées depuis le démarrage du script |
$? | Code retour de la dernière commande lancée |
Calculs
Pour effectuer un calcul, il faut l'encadrer par les balises : $(( <calcul> ))
Conditions (if ... then ... else)
Condition en une ligne
if <condition>; then <commandes>; fi
ou
if <condition>; then ; <commandes>; else <commandes>; fi
Condition sur plusieurs lignes
if <condition>
then
<commandes>
else
<commandes>
fi
ou
if <condition>
then
<commande>
elif <condition>
then
<commande>
else
<commande>
fi
Comparaison
Variables de type chaîne
Opérateur | Description | Exemple |
= | Egalité | if [ ma_variable = "b" ] |
!= | Différence | if [ ma_variable != "b" ] |
-z | Est vide | if [ -z ma_variable ] |
-n | Est non vide | if [ -n ma_variable ] |
Variables de type nombre
Opérateur | Description | Equivalent mathématique | Exemple |
-eq | Egalité | = | if [ var1 -eq var2 ] |
-ne | Différence | <> | if [ var1 -ne var2 ] |
-gt | Supérieur (greater than) | > | if [ var1 -gt var2 ] |
-ge | Supérieur ou égal (greater or equal) | >= | if [ var1 -ge var2 ] |
-lt | Inférieur (lesser than) | < | if [ var1 -lt var2 ] |
-le | Inférieur ou égal (lesser or equal) | <= | if [ var1 -le var2 ] |
Tests de correspondance (CASE)
La commande case <variable> in permet d'effectuer un traitement selon une valeur. Voici un exemple :
case ${nombre} in
1)
echo "Le nombre est 1."
;;
2)
echo "Le nombre est 2."
;;
*)
echo "Le nombre n'est ni 1, ni 2."
;;
esac
Il est possible de tester plusieurs variables, comme ceci :
case "${nombre1}-${nombre2}" in
1-*)
echo "Le 1er nombre est un 1."
;;
*-2)
echo "Le 2ème nombre est un 2."
;;
*)
echo "Le 1er nombre n'est pas un 1 et le 2ème n'est pas un 2."
;;
esac
Fonctions logiques
On peut utiliser les fonctions logiques NON, ET, OU avec les comparaisons. A noter que pour les opérateurs logiques ET et OU, où on combine les conditions, il faut doubler les crochets.
Fonction | Description | Exemple |
! | NON : inverse le sens du test | if [ ! ${a} = ${b} ] |
&& | ET : combine plusieurs conditions obligatoires | if [[ ${a} = ${b} && ${b} = ${c} ]] |
|| | OU : combine plusieurs conditions optionnelles | if [[ ${a} = ${b} || ${b} = ${c} ]] |
Itération
Boucles FOR
for i in $(seq 1 5)
do
echo "${i}"
done
Dans le cas ci-dessus, on utilise la commande seq, qui crée une séquence de 1 à 5.
Boucles WHILE
i=1
while [ $i -le 5 ]
do
echo "${i}"
i=$(($i+1))
done
Fichier
Vérifier si un fichier existe
if [ -f "${mon_fichier}" ]; then echo "Fichier existe"; fi
Vérifier si un fichier est un lien symbolique
if [ -h "${mon_fichier}" ]; then echo "Fichier est un lien symbolique"; fi
Vérifier si un fichier a une taille > 0
if [ -s "${mon_fichier}" ]; then echo "Fichier contient des données"; fi
Vérifier si un fichier est exécutable
if [ -x "${mon_fichier}" ]; then echo "Fichier est un exécutable"; fi
Comparer les dates de modification
Il faut utiliser -nt et -ot entre deux fichiers pour comparer les dates de modification de deux fichiers :
if [ "${fichier_1}" -nt "${fichier_2}" ]; then echo "${fichier_1} existe et est plus récent que ${fichier_2}"; fi
if [ "${fichier_1}" -ot "${fichier_2}" ]; then echo "${fichier_1} existe et est plus ancien que ${fichier_2}"; fi
Répertoire
Vérifier si un répertoire existe
if [ -d "${mon_repertoire}" ]; then echo "Répertoire existe"; fi
Récupérer le répertoire du script lancé
rep_script=$(readlink -f $0 | xargs dirname)
Divers
Au début du script Bash
- Commencez toujours un script bash par la ligne ci-dessous pour définir l'interpréteur shell :
- Vérifiez le nombre d'arguments en entrée avec ceci :
if [ $# -ne 4 ] then
echo "Nombre d'arguments incorrect"
exit 1
fi
- Utilisez l'extension .sh ou .bash
- Si vous mettez en début de script la ligne suivante, l'interpréteur bash stoppera l'exécution du code dès qu'une erreur est rencontrée :
- L'interpréteur stoppera également si vous utilisez une variable non déclarée si vous indiquez :
- Utilisez la ligne suivante pour activer le déboggageVous pouvez aussi faire en sorte que si le script est lancé avec la variable DEBUG=1, les traces d'exécution de chaque commande sont affichées :
# Affiche les traces si script lancé comme ceci :DEBUG=1 ./script.sh
if [[ "${DEBUG-0}" == "1" ]]; then set -o xtrace; fi
Vérifier l'exécution d'un programme
Si vous avez appelé un programme, vous pouvez récupérer son code retour juste après son exécution et le renvoyer à l'appelant, comme ceci :
java -jar mon_programme.jar
statut=$? # Récupère le code retour de la ligne précédente
echo "Code retour de java : ${statut}"
exit ${statut}
Créer des variables multi-lignes
Si vous souhaitez écrire la valeur d'une variable sur plusieurs lignes, suffixez chaque ligne par "\", comme ci-dessous :
ma_variable="Ceci\
est \
une valeur \
sur plusieurs lignes"