Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Paradigmes informatiques

Mémo sur les scripts BASH

08/03/2023

Un mémo sur les commandes utiles pour créer un script Bash.

Variables

Créer une variable

a="test"
b=2

Pour affecter le résultat d'une commande shell, on peut utiliser $() :

nb_rep=$(ls / | wc -l)

Afficher une variable

echo $a

ou

echo ${a}

ou encore mieux, pour respecter les retours chariot si la variable en contient :

echo "${a}"

Obtenir le nombre de caractères d'une variable

echo ${#a}

-> Renvoie "4" si a="test"

Extraire une sous-chaîne

Il faut utiliser les expressions : ${variable:position} ou ${variable:position:longueur}

echo ${a:2}

-> Renvoie "st" si a="test", car renvoie les X derniers caractères.

echo ${a:1:2}

-> Renvoie "es" si a="test" car la sous-chaîne commence à 0.

Incrémenter une variable

i=$((i+1))

-> 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 :

NomDescription
$HOMERépertoire personnel de l'utilisateur
$PATHValeur de la variable d'environnement PATH, qui contient les chemins de recherches
$$PID du processus
$PPIDPID du processus parent
$IPID du processus enfant
$PWDRépertoire actuel (peut être différent du répertoire du script)
$SECONDSNombre 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> ))

echo $((4+3))

Conditions (if ... then ... else)

Condition en une ligne

if <condition>; then <commandes>; fi

ou

if <condition>; then ; <commandes>; else <commandes>; fi

Remarques :

$b=true;
if $b; then
    echo "La variable est à true"
fi

if [[ $b ]]; then
    echo "La variable existe est est non vide (mais pas forcément à true)"
fi

if [[ $b == "true" ]]; then
    echo "La variable est à true"
fi

Attention à bien respecter les espaces avant et après les crochets ainsi que avant et après les signes "==" !

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érateurDescriptionExemple
=Egalité
if [ ma_variable = "b" ]
!=Différence
if [ ma_variable != "b" ]
-zEst vide
if [ -z ma_variable ]
-nEst non vide
if [ -n ma_variable ]

Variables de type nombre

OpérateurDescriptionEquivalent mathématiqueExemple
-eqEgalité=
if [ var1 -eq var2 ]
-neDifférence<>
if [ var1 -ne var2 ]
-gtSupérieur (greater than)>
if [ var1 -gt var2 ]
-geSupérieur ou égal (greater or equal)>=
if [ var1 -ge var2 ]
-ltInférieur (lesser than)<
if [ var1 -lt var2 ]
-leInfé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.

FonctionDescriptionExemple
!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 :
    #!/bin/bash
  • 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 :
    set -o errexit
  • L'interpréteur stoppera également si vous utilisez une variable non déclarée si vous indiquez :
    set -o nounset
  • Utilisez la ligne suivante pour activer le déboggage
    set -o xtrace
    Vous 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"
Dernière modification le 08/03/2023 - Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez

Rechercher sur le site

fr en rss RSS info Informations