Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Réflexions informatiques

Mémo sur le Shell BASH

08/03/2023

Un mémo sur les commandes utiles dans un shell 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}

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 :

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

echo $((4+3))

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 :
    #!/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

Rechercher sur le site

fr en rss RSS info Informations