Dernière modification : 07/01/2023

Commandes Bash - Mémo

Ce ticket est un aide-mémoire non exhaustif sur les principales commandes bash sous Unix. Nous vous conseillons d'utiliser la commande man ou --help pour avoir plus d'informations sur celle-ci (documentation).

Remarque : Cet article contient des commandes pouvant entraîner des pertes de données, etc. Il est par conséquent important de se renseigner via la documentation avant de les utiliser.

 

1. Fichiers et répertoires

1.1 Changer de répertoire : cd

cd /home/
cd "/home/mon utilisateur/"
cd /home/mon\ utilisateur/ # Échappement de l'espace
cd $MON_REPERTOIRE # Avec une variable
cd - # Positionne au répertoire précédent
cd # Positionne au répertoire d'accueil de l'utilisateur, identique à cd ~/

Remarque :

  • Commencer par "/" pour débuter à la racine
  • Commencer par "~" pour commencer au répertoire d'accueil de l'utilisateur
  • ".." pour remonter dans l'arborescence, exemple "../home/"
  • Si un blanc est contenu dans le nom du dossier, il est nécessaire de l'échapper via le caractère \, exemple : mon\ dossier. Sinon, il est nécessaire de mettre des guillemets "mon dossier".

1.2 Lister les fichiers/dossiers et leurs caractéristiques : ls

ls # Affiche les fichiers/dossiers du répertoire courant
ls /home # Affiche les fichiers/dossiers du répertoire /home
# L'option "-l" affiche en format long : droits d'accès propriétaires, groupes, taille répertoire/fichier... L'option "-a" affiche les fichiers commençants par "."
ls /home -la
ls /var/log/*log # Affiche tous les fichiers se terminant par "log"
ls -F # Fait suivre le nom des répertoires avec un slash
ls -lr # liste les fichiers en inversant l'ordre

Remarque :

  • Par défaut, la commande ls affiche les fichiers triés par ordre alphabétique
  • Avec l'option "-l", la taille des fichiers/dossiers est affiché en bytes. Pour avoir un affichage plus "humain", l'utiliser avec "-h".

1.3 Afficher le répertoire courant : pwd

1.4 Déplacer ou renommer un fichier/dossier : mv

mv ficA.txt ficb.txt # Renommage
mv ../monFichier.txt ./ # Déplacer le fichier "monFchier.txt" vers le répertoire courant
mv ../monFichier.txt monDossier/ # Déplacer le fichier "monFchier.txt" vers le dossier monDossier
mv monDossier monDossier2 # Renomme monDossier en monDossier2
mv monDossier2/* ../ # Déplace tout le contenu (*) du dossier monDossier2 dans le dossier parent (../)

1.5 Copier un fichier : cp

cp monFichier monDossier/ # Copie simple d'un fichier
cp monDossier/* monDossier2/ # Copie du contenu du dossier dans un autre
cp -r monDossier/ monDossier3/ # Copie de monDossier en monDossier3 via l'option -r (récursive)

1.6 Création d'un fichier : >, >> et touch

Commande touch, met à jour la date et l'heure d'accès pour la dernière modification d'un ou plusieurs fichiers avec la date actuelle. Si le fichier n'existe pas, il le crée à vide.

touch monFichier.txt

Également avec le système de redirection de flux :

> monFixhier.txt # Crée le fichier s'il n'existe pas. Attention, le vide s'il existe !
true > monFixhier.txt # pareil que précédemment

>> monFixhier.txt # Crée le fichier s'il n'existe pas, ne modifie ni son contenu ni sa date s'il existe.

echo "AAA" > monFixhier.txt # Crée le fichier s'il n'existe pas. Met "AAA" dedans.

1.7 Suppression de fichier/dossier : rm

rm monFichier.txt # Suppression d'un fichier du répertoire courant
rm *.log # Suppression de tous les fichiers se terminant par .log du répertoire courant

rm -r monDossier/ # Supprime un dossier (récursive)
rm -rf monDossier/ # Supprime un dossier avec l'option "force". Donc, aucune demande de confirmation sur certains dossiers ne sera pas demandée (attention à son utilisation)

1.8 Afficher le contenu d'un dossier : cat

cat monFichier.txt # Affiche le contenu du fichier
cat -n monFichier.txt # Affiche le contenu du fichier avec les lignes numérotées
cat *.log # Affiche tout le contenu des fichiers se terminant par log

1.9 Afficher les premières lignes : head

Affiche les 10 premières lignes du fichier

head monFichier.txt # Affiche les 10 premières lignes
head -n 5 monFichier.txt # Affiche les 5 premières lignes
head -n -5 monFichier.txt # Afficher tout sauf les 5 dernières lignes
head -n -5 monFichier1.txt monFichier2.txt # Afficher tout sauf les 5 dernières lignes des fichiers monFichier1.txt, puis monFichier2.txt

1.10 Afficher les dernières lignes : tail

tail monFichier.txt # Affiche les 10 dernières lignes
tail -n 5 monFichier.txt # Affiche les 5 dernières lignes
tail -n +5 monFichier.txt # Afficher tout sauf les 5 premières lignes
tail -n +5 monFichier1.txt monFichier2.txt # Afficher tout sauf les 5 premières lignes des fichiers monFichier1.txt, puis monFichier2.txt

1.11. Autres affichages : more et less

more monFichier.txt # Affichage page par page
less monFichier.txt # Pour les gros fichier

 

2 Gestion des commandes

2.1. Exécution d'une commande

maCommande
maCommande & # Commande exécutée en arrière-plan
maCommande1; maCommande2; # Commandes exécutées séquentiellement

Les opérateurs logiques && (et) et || (ou) permettent de conditionner l'exécution des commandes

# maCommande1 && maCommande2;
# Exécution de maCommande1 puis de maCommande2 si maCommande1 sort en succès
mkdir monDossier && touch monDossier/monFichier.txt

# maCommande1 || maCommande2;
# Exécution de maCommande1 puis de maCommande2 si maCommande1 sort en erreur.
mkdir monDossier || echo "KO"

# maCommande1 && maCommande2 || maCommande3;
# Exécution de maCommande1 puis de maCommande2 si maCommande1 sort en succès.
# Si maCommande1  ou maCommande2  sont en erreur, alors exécution de maCommande3.
mkdir monDossier && echo "OK" || echo "KO"

Remarque : Pour savoir si une commande sort en erreur, on peut, après avoir exécuté la commande, afficher le contenu de la variable $?, qui renvoi 0 si la commande s'est bien exécuté, une autre valeur sinon.

mkdir monDossier
echo $? # Output : 0 => succès
mkdir monDossier # Output : mkdir: cannot create directory ‘monDossier ’: File exists
echo $? # Output : 1 => erreur car le dossier existe déjà

2.2. Gestions des flux

Chaque processus possède par défaut :

  • Une entrée (stdin)
  • Une sortie standard (stdout : 1)
  • Une sortie d'erreurs (stderr : 2)

Appelé "pipe", le mode tube ("|") redirige la sortie d'une commande dans l'entrée d'une autre commande. Ici, de maCommande1 vers l'entrée de maCommande2 :

maCommande1 | maCommande2

Redirection dans un fichier :

# Ne redirige que la sortie standard (stdout 1) vers monFichier.txt
maCommande > monFichier.txt

# Lit le fichier monFchier et renvoie le contenu de la lecture initialement vers la sortie standard vers le fichier monFichier2.txt (crée ou vide le fichier monFichier2.txt si existant)
cat monFichier > monFichier2.txt

# Similaire à la commande précédence, mais ajoute à la suite du fichier (ne vide pas le fichier avant la lecture).
maCommande >> monFichier.txt

# Redirige les erreurs vers le fichier (crée ou vide le fichier fichierErreur.log si existant)
maCommande 2> fichierErreur.log
mkdir monDossier 2> fichierErreur.log

# Similaire à la commande précédence, mais ajoute à la suite du fichier (ne vide pas le fichier avant la lecture).
maCommande 2>> fichierErreur.log

Outils :

# Ne jamais utiliser la sortie d'erreur ni la voir, alors la rediriger vers dev/null
maCommande 2>/dev/null

# N'avoir aucune sortie
maCommande > /dev/null 2>&1

# Renvoyer la sortie d'erreur dans le même fichier que la sortie standard
maCommand > monFichier.log 2>&1

Redirection de l'entrée standard avec < ou <<. Le mot clé situé après "<<" doit apparaître sur une nouvelle ligne contenant uniquement ce mot clé pour signifier la fin de l'entrée standard pour la commande spécifiée.

maCommande << MOT_CLE TEXT
TEXT
MOT_CLE

echo << END "AAA"
END # Output: AAA


# Redirige l'entrée contenu dans monFichier.txt vers maCommande
maCommande < monFichier.txt

2.3 Gestion des processus

ps # Liste les processus utilisateurs
ps -A # Liste tous les processus
top # Liste tous les processus et leur charge, plus visuel que ps
htop # Comme top, mais plus lisible (paquet à installer)
kill PID # Arrêter un processus par son PID
kill -9 PID # envoie de l'évènement SIGKILL au processus (force l’arrêt du processus)
killall NOM # Arrêter un processus par son nom

 

3. Les variables

3.1 Création

Déclaration basique : NOM_VARIABLE="VALEUR" ou NOM_VARIABLE='VALEUR' :

age=30
firstName="Alex"
firstName='Alex'

Exemple d'utilisation :

echo "Je m'appelle $firstName, j'ai ${age} ans."
# Output : Je m'appelle Alex, j'ai 30 ans.

# Fonctionne également pour afficher seulement le contenu de la variable
echo $firstName
echo ${age}

Pour afficher une variable on peut utiliser la syntaxe $NOM_VARIABLE, ou ${NOM_VARIABLE} (best practices)

Remarque :

  • Il est possible d'utiliser ' ' au lieu de " ", mais les variables à l'intérieur ne seront pas interprétées.
  • Attention, pas d'espace au niveau du symbole égal.

Autres formes de déclaration utiles :

# Lecture seule
readonly lastName="Brown" # ou declare -r

# Déclarer une variable comme étant un entier
declare -i age=30

3.2 Suppression : unset

Pour supprimer une variable, il est nécessaire d'utiliser la commande unset.

unset firstName;
echo "Je m'appelle $firstName, j'ai ${age} ans."
# Output : Je m'appelle , j'ai 30 ans.

3.3 Visibilité : local / export

Lors de sa déclaration, par défaut, une variable n'est visible que dans son environnement courant. Elle peut être également locale (portée dans une fonction) via le mot clé "local", ou avoir une visibilité plus globale (visible dans tout l'environnement) via le mot clé "export" :

firstName="Alex" # visible dans l'env. d'exec courant
local firstName; # Visible localement (fonction par exemple)
export firstName; # Visible globalement (dans tout l'environnement)

Exemple :
function test() {
  local firstName;
  firstName="Alex";
  echo $firstName;
}
firstName="Claire";
echo $firstName; # Output: Claire
test; # Output: Alex
echo $firstName; # Output: Claire

3.4 Réaliser des calculs

De manière générale, vous noterez qu'il y a des espaces au début et à la fin des fermetures des opérations. Sans, vous aurez une erreur.

resultat=$(( (10 * 5) + 3 ))
resultat=$[ (10 * 5) + 3 ]

Voir aussi la fonction let.

3.5 Variables d'environnement

Utiles dans les scripts :

  • $SECONDS: Le nombre de secondes pendant lesquelles le script a été exécuté.
  • $LINENO: Retourne le numéro de ligne courante du script (utile pour le debug)
  • $RANDOM: Retourne un nombre aléatoire

Utiles à la sortie d'une exécution d'une commande/script :

  • $?: Le code de sortie du dernier programme exécuté

Utiles en général :

  • $USER: Le nom d'utilisateur
  • $HOSTNAME: Le nom de la machine
  • $HOME: Répertoire utilisateur
  • $PWD: Répertoire courant
  • $PATH: ensemble des répertoires contenant les commandes exécutables par l'utilisateur
  • $SHELL: Nom du shell de connexion
  • $HITSIZE: Nombre de lignes ou de commandes stockées en mémoire dans une liste d'historique pendant que votre session bash est en cours.
  • $HISTFILESIZE : Nombre de lignes ou de commandes, autorisées dans le fichier d'historique au démarrage d'une session et stockées dans le fichier d'historique à la fin de votre session bash.

Voir aussi la fonction env.

 

4. Les chaînes de caractères

4.1 Échappement des caractères spéciaux

Comme vu précédemment, pour lister un fichier contenant un espace, nous devions mettre le caractère \ devant l'espace. Sans cela, nous aurions eu une erreur. Plusieurs caractères dit "spéciaux" ne sont pas interprétés de la même manière. L'espace aurait signifié qu'il y avait un second argument (cd /home/mon\ utilisateur/). De même, le *, qui signifie "tout" (cat *.log).

Exemples avec l'étoile :

echo Il a vu une * # Output : Il a vu une Monfichier.txt onfichierA.txt monfichierB.txt

Les caractères spéciaux qu'il faut protéger sont en générale les suivants : ", ', `, \, $, !, ?, ~, (), [], {}, @, *

Ils peuvent être protégés par un \, être entre ' ou " :

echo "Il a vu une *" # Output : Il a vu une *
echo 'Cela fonctionne !' # Output : Cela fonctionne !
echo "Cela fonctionne aussi !" # Output : Cela fonctionne aussi !
echo Cela\ fonctionne\ également\ \! # Output : Cela fonctionne également !

# Échapement également dans les " "
echo "Mon path est $PATH et mon shell est $SHELL" # Remplacera les variables $...
echo "Mon path est \$PATH et mon shell est \$SHELL" # Ne remplacera pas les variables $
echo 'Mon path est $PATH et mon shell est $SHELL' # Ne remplacera pas les variables $..., aura la même valeur que la commande précédente

4.2 Création d'une chaîne de caractères

maChaine="Alex" # la variable contient "Alex"
maChaine=$(ls /) # la variable contient le listing du dossier racine ( / )
maChaine=`ls /` # la variable contient le listing du dossier racine ( / ). Obsolète.

4.3 Manipulation d'une chaîne de caractères

Manipulation de chaîne de caractères pour assignation:

      

commandes / Paramètre

variable set et non null variable set et null variable unset
Utilisation de valeurs par défaut

${variable:-alternative}

retourne variable retourne variable retourne alternative

${variable-alternative}

retourne variable retourne null retourne alternative
Assignation de valeurs par défaut

${variable:=alternative}

retourne variable assignation, retourne alternative assignation, retourne alternative

${variable=alternative}

retourne variable retourne null assignation, retourne alternative
Indication d'erreur

${variable:?alternative}

retourne variable erreur, exit erreur, exit

${variable?alternative}

retourne variable retourne null erreur, exit
Utilisation d'alternative

${variable:+alternative}

retourne alternative retourne null retourne null

${variable+alternative}

retourne alternative retourne alternative retourne null

Exemples :

# Aide à la récupération de valeur par défaut si non définie => ":-"
echo ${VARIABLE1-$VARIABLE2} => si VARIABLE1 n est pas définie ou vide, $VARIABLE2 retournée
${VARIABLE1-'text'} => si VARIABLE1 n est pas définie ou vide, 'text' sera retourné

# Aide à la récupération de valeur par défaut si non définie et non vide => ":-"
echo ${VARIABLE1:-$VARIABLE2} => si VARIABLE1 n est pas définie et est non vide, $VARIABLE2 sera retournée
${VARIABLE1:-'text'} => si VARIABLE1 n est pas définie ou vide et est non vide, 'text' sera retourné

# Aide à l assignation d une variable si non définie et non vide => ":="
echo ${VARIABLE1=$VARIABLE2} => si VARIABLE1 n est pas définie, $VARIABLE2 sera retournée et VARIABLE1 aura la valeur de $VARIABLE2
${VARIABLE1='text'} => si VARIABLE1 n est pas définie ou vide, 'text' sera retourné et affecté à VARIABLE1

# Aide à l assignation d une variable si non définie et non vide => ":="
echo ${VARIABLE1:=$VARIABLE2} => si VARIABLE1 n est pas définie et est non vide, $VARIABLE2 sera retournée et VARIABLE1 aura la valeur de VARIABLE2
${VARIABLE1:='text'} => si VARIABLE1 n est pas définie ou vide et est non vide, 'text' sera utilisé

# Erreur si la variable n est pas définie => "?" et ":?"
VARIABLE1=""
${VARIABLE1?"Variable is not set"} # bash: VARIABLE1: Variable is not set
unset VARIABLE1
${VARIABLE1:?"Variable is not set or empty"} # bash: VARIABLE1: Variable is not set or empty

 

Extraction de chaînes de caractère

Commande Résumé
${#variable} Renvoie la taille de la variable
${variable:X} Récupération d'une sous chaîne après le X ème caractère
${variable:-X} Récupération des X derniers caractères
${variable:X:Y} Récupération d'une sous chaîne après le X ème caractère pour une longueur de Y
${variable::X} Récupération des X premiers caractères
${variable::-X} Récupération de tous les caractères, sans les X derniers
${variable#pattern} Récupération de tous les caractères en supprimant depuis le début de la chaîne la portion correspondant au pattern
${variable##pattern} Récupération de tous les caractères en supprimant depuis le début de la chaîne la portion la plus longue correspondant au pattern
${variable%pattern} Récupération de tous les caractères en supprimant depuis la fin de la chaîne la portion correspondant au pattern
${variable%%pattern} Récupération de tous les caractères en supprimant depuis la fin de la chaînes la portion la plus longue correspondant au pattern
${variable,,} Renvoie la variable en minuscule
${variable^^} Renvoie la variable en majuscule

Exemples :

firstName="Alexandre"

echo "Taille de la chaine ${#firstName}" # Output: Taille de la chaine 9

echo "Je coupe la chaine : ${firstName:4}" # Je coupe la chaine : andre

echo "${firstName: -3}" # dre

echo "Je coupe la chaine a une taille fixe : ${firstName:4:3}" # Je coupe la chaine a une taille fixe : and

echo "Je coupe la chaine a une taille fixe : ${firstName:4:30}" # Je coupe la chaine a une taille fixe : andre

echo "${firstName::3}" # Ale

echo "${firstName::-3}" # Alexan

myText="La mise en developpement a ete effectuee correctement ce matin. Cette mise en developpement a duree 30 minutes."

echo ${myText#La*a} # Output: ete effectuee correctement ce matin. Cette mise en developpement a duree 30 minutes.

echo ${myText##La*a} # Output: duree 30 minutes.

echo ${PWD%/*}

echo ${myText%% *} # Output: La

# Transformer en minuscule
echo ${myText,,}

# Transformer en majuscule
echo ${myText^^}

 

Remplacement de chaîne de caractère

Commande Résumé
${variable/AA/BB} Retourne la valeur de la variable avec le remplacement de la première occurence de AA par BB
${variable//AA/BB} Retourne la valeur de la variable avec le remplacement de toutes les occurences de AA par BB

Exemples :

myText="La mise en developpement a ete effectuee correctement ce matin. Cette mise en developpement a duree 30 minutes."

# Remplacer developpement par integration (première occurence)
echo ${myText/developpement/integration}
# Output: La mise en integration a ete effectuee correctement ce matin. Cette mise en developpement a duree 30 minutes.

# Remplacer developpement par integration (toutes les occurences)
echo ${myText//developpement/integration}
# Output: La mise en integration a ete effectuee correctement ce matin. Cette mise en integration a duree 30 minutes.

Exemple concret :

file="/etc/log/log.txt"
fileName="log.txt"

# Extrait le chemin
echo ${file%/*} # /etc/log/
# Extrait le fichier
echo ${file##*/} # log.txt
# Extrait le fichier sans l'extension
echo ${fileName%.*} # log
# Extrait l'extention du fichier
echo ${fileName##*.} # txt

 

5. Les scripts Bash

Les scripts bash ont comme extension de fichier .sh (bien que cela soit facultatif). Ces scripts ont comme première ligne #!/bin/bash (shebang), ce qui permet de définir avec quoi le script sera interprété (ici bash).

Liste variables d'arguments :

  • $0 : Nom du script
  • $1, $2, $3 .. : argument 1, argument 2, argument 3 ....
  • $#: Nombre de paramètres fournis en entrée du script
  • $* ou $@  (n'ont pas le même comportement entre guillemet) : Chaîne de caractère contenant toutes les commandes fournies en entrée du script

Afin d'ajouter des paramètres en mettant à jour automatiquement $1 etc, utiliser la commande set, exemple :

set alex 21

 

Variables standards utiles :

  • $$: L'id du processus (PID) courant
  • $? : Code de retour de la dernière commande exécutée
  • $! : Numéro du processus de la dernière commande
  • $SECONDS: Le nombre de secondes pendant lesquelles le script a été exécuté.
  • $LINENO: Retourne le numéro de ligne courante du script (utile pour le debug)

Un script bash a une valeur de sortie par défaut à 0, qui est par convention une sortie à succès. Il est possible de sortir en échec, via la commande exit. Le code de sortie peut aller de 0 à 255 inclus maximum.

exit 25;

La récupération de cette valeur est effectuée via la variable $?. Prenons pour exemple "monScript.sh qui fait un "exit 25;" uniquement :

./monScript.sh
echo "Code d'erreur : $?"; # Output: Code d'erreur : 25
echo "Code d'erreur : $?"; # Output: Code d'erreur : 0

Remarque : On peut voir que le deuxième "echo" renvoit "0" en code d'erreur, car "$?" renvoit le code d'erreur de la dernière commande exécutée => ici le "echo" précédent qui a correctement affiché "Code d'erreur : 25".

Pour inclure un script bash dans un autre, il est nécessaire de l'exécuter. Exemple :

my_dir="/your/path"
"$my_dir/other_script.sh"

 

6. Les fonctions

Afin d'éviter d'avoir tout dans un même block, bash permet de créer des fonctions.

#Fonction sans argument
function exemple {
  echo "Bonjour";
}

#Fonction avec 2 arguments
function exemple2 {
  echo "Bonjour $1 et $2, j'ai $# arguments";
  echo "Voici tous mes arguments : $*";
  echo "Ou encore : $@";
}

maVariavle=$(exemple) # On peut stocker la sortie d'une fonction dans une variable
echo $maVariavle # Output: Bonjour

exemple2 A B # Remarque : Les appels se font sans parenthèses ni virgule pour séparer les arguments. Un espace suffit
# Output:
# Bonjour A et B, j'ai 2 arguments
# Voici tous mes arguments : A B
# Ou encore : A B

# Permet d obtenir la déclaration de la fonction
declare -f exemple2
#Output
#exemple2 ()
#{
#    echo "Bonjour $1 et $2, j'ai $# arguments";
#    echo "Voici tous mes arguments : $*";
#    echo "Ou encore : $@"
#}

 

7. Tableaux et Dictionnaires (map)

Les tableaux (tableaux indexés => en clé des entiers) fonctionnent presque pareil que des dictionnaires (comme des map : tableaux associatifs => en clé des entiers / chaînes de caractères).

Action / Type Tableau Dictionnaire

Déclaration

declare -a myTab declare -A myDico
Initialisation

myTab=( 30 Alex )

myTab=( [0]=30 [10]=Alex )

myDico=( [age]=25 [10]=Alex )

Affichage

echo $myTab[0]

echo ${myTab[0]}

echo $myDico[30]

echo $myDico[age]

echo ${myDico[age]}

Afficher tout *

echo ${myTab[*]}

echo ${myTab[@]}

echo ${myDico[*]}

echo ${myDico[@]}

Taille ${#myTab[*]} ${#myDico[*]}
Taille d'un élément ${#myTab[0]} ${#myDico[age]}
Liste des indices ${!myTab[*]} ${!myDico[*]}

Remarque * : [@] ou [*] : préférer [@] entre guillemet pour garder les vraies valeurs (différencier les espaces d'un autre élément). Sans guillemet ils ont le même comportement, mais avec les guillemets, [*] renverra tout sur un seul mot et [@] renverra chaque élément comme étant un mot distinct.

8. Structures de contrôle

8.1 Les tests et la commande if

Il existe plusieurs manières d'implémenter une condition (les espaces sont importants) :

if [ $MA_VARIABLE -gt 2 ] ; then # Si MA_VARIABLE greater than > 2
  echo "OUI"
fi

if [ $# -lt 2 ] ; then
  echo "OUI"
else
  echo "NON"
fi


if [ $# -gt 2 ] ; then
  echo "OUI"
elif [ $# -eq 0 ] ; then # else if
  echo "PEUT-ETRE"
else
  echo "NON"
fi

# Il est possible de réaliser un test avec la commande test et les []
if test $MA_VARIABLE -gt 2  ; then # Si MA_VARIABLE greater than > 2
  echo "OUI"
fi

 

Comparateurs :

Type opérateur Description Exemple
Arithmétiques -eq est égale à if [ "$a" -eq "$b" ]
-ne est non égale à if [ "$a" -ne "$b" ]
-gt est supérieur à if [ "$a" -gt "$b" ]
-ge est supérieur ou égale à if [ "$a" -ge "$b" ]
-lt est inférieur à if [ "$a" -lt "$b" ]
-le est inférieur ou égale à if [ "$a" -le "$b" ]
< est inférieur à (("$a" < "$b"))
<= est inférieur ou égale à (("$a" <= "$b"))
> est supérieur à (("$a" > "$b"))
>= est inférieur ou égale à (("$a" >= "$b"))
Chaîne de caractère = est égale à (string) if [ "$a" = "$b" ]
== est égale à (string, faire attention) if [ "$a" == "$b" ]
!= est non égale à (string) if [ "$a" != "$b" ]
< est inférieur à (ASCII) if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
> est supérieur à (ASCII) if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
-z chaînes est nulle ou à une taille de 0 [ -z "$a" ]
-n chaînes est non nulle et à une taille > 0 [ -n "$a" ]
Fichier -e le fichier existe [ -e "$a" ]
-d le répertoire existe [ -d "$a" ]
-r le fichier est lisible [ -r "$a" ]
-o vous être le propriétaire du fichier [ -o "$a" ]
-x le fichier est exécutable [ -x "$a" ]

Pour combiner les tests, on peut utiliser les opérateurs && et || avec les doubles crochets, -a (pour et) et -o (pour ou) avec les simples crochets.

8.2 Le case

Il permet généralement de gérer les paramètres d'un programme.

Exemple :

while [[ $# -gt 0 ]]
do
  key="$1"
  case $key in
    -a1|--argument1)
      ARGUMENT1="$2"
      shift # past argument
      shift # past value
    ;;
    -a2|--argument2)
      ARGUMENT2="$2"
      shift 2 # past 2 argument
    ;;
    --a3)
      a3=YES
      shift # past argument
    ;;
    --help)
      echo "how to use : ....";
      //exit ;
      shift # past argument
    ;;
    *)    # unknown option
    echo "Error in argument with $1"
    //exit 1
    shift # past argument
    ;;
  esac
done

Remarque : La commande shift permet de décaler les arguments vers la gauche. La valeur de $1 <= $2, $2 <= $3 et ainsi de suite. Par conséquent, $# est également décrémenté.

8.3 Bouche for

firstName1="Alex";
firstName2="Claire";
firstName3="Angel";

# Avec une liste
for firstName in $firstName1 $firstName2 $firstName3; do
  echo $firstName;
done

# Output:
# Alex
# Claire
# Angel

# Avec un retour d'une commande
for item in $(ls); do
  echo item: $item;
done

# Output:
# item: fileA.txt
# item: fileB.txt
# item: fileC.txt
# item: folderA

# Avec un retour d'une commande #2 (séquence de nombre)
for i in $(seq 1 5); do
  echo $i;
done

# Output:
# 1
# 2
# 3
# 4
# 5

# Boucle evc itération
for ((it=0; it<= 5; it++)); do
  echo $it;
done

# Output:
# 1
# 2
# 3
# 4
# 5

declare -a myArray;
myArray=( Alex Claire Angel );

for firstName in "${myArray[@]}"
do
  echo "${firstName}"
done

# Output:
# Alex
# Claire
# Angel

8.4 Boucle while

it=0;
while [ $it -lt 5 ] ; do
  echo "it : ${it}";
  it=$(( $it + 1 )) # egale a ((it++))
done

# Output :
# it : 0
# it : 1
# it : 2
# it : 3
# it : 4

while :
do
  read -p "Entrer votre age : " age # Lit sur la sortie standard
  echo "Vous avez ${age} ans";

  if [ ${age} -ge 100 ] ; then
    echo "Vous etes agee";
    break;
  else
    echo "Vous n'etes pas assez age"
  fi
  echo "Je ne sortirais pas d'ici sans avoir rencontre quelqu'un de 100 ans ou plus.";
done

# Output
# Entrer votre age : 30
# Vous avez 30 ans
# Vous n'etes pas assez age
# Je ne sortirais pas d'ici sans avoir rencontre quelqu'un de 100 ans ou plus.
# Entrer votre age : 101
# Vous avez 101 ans
# Vous etes agee

# Lire un fichier ligne par ligne
while read LINE; do
    echo $LINE;
done < fichier.txt

# Output
# Contenu de la premiere ligne
# Contenu de la deuxieme ligne
# contenu de la troisieme et derniere ligne du fichier.

9. Commandes utiles

  • -d : délimiteur
  • -f : numéro de champ
  • -c : positions à extraire
  • -b : sélection de bytes
Commande Arguments Objectif
basename pathToFichier Affiche le nom du fichier
chmod
  • 777
  • (u|g|o|a)(+|-)(r|w|x)
  • -R : recursive

fichier(s)/dossier(s)

Permission d'accès fichier
chown
  • owner:group
  • -R : recursive

fichier(s)/dossier(s)

Changement du propriétaire et du groupe lié au fichier/dossier
cut

Extrait une ou plusieurs colonnes d'un fichier. Exemple :

  • -c 1,2,3,5-7
  • -b 1,2,3,5-7
  • -d " " -f 1,2
date '+%Y-%m-%d %H:%M:%S.%N' Affiche la date : 2020-01-31 22:30:46.900886000
'+%A %d-%B, %Y' Autre format
diff fic1 fic2 Affiche les différences entre fic1 et fic2
dirname pathToFichier Affiche le chemin d'accès au fichier
du
  • -h (human) : Poids des fichiers plus lisible
  • --max-depth=n : profondeur maximale
  • -s : Afficher seulement le total pour chaque élément

Statistiques sur l'utilisation du disque.

Affiche les fichiers et répertoires (récursivement) du répertoire courant et leurs poids associés.

(Exemple: du --count-links --dereference --human-readable --max-depth=1)

df -h (human readable) : améliore la lisibilité sur les poids des fichiers Quantité d'espace occupé des systèmes de fichiers.
find

répertoire

  • -name : par nom de fichier
  • -type : par type
  • -size : par taille

Recherche des fichiers ou des répertoires satisfaisant les paramètres. Exemple :

find / -type f # Recherche tous les fichiers du system.

grep

motif fichier/dossier

  • -c : Affiche le nombre de ligne contenant le motif
  • -n affiche le numéro de la ligne
  • -v affiche les lignes ne contenant pas le motif (reverse)
  • -r récursif
  • -i ignore la casse
Recherche dans des fichiers le motif dans le fichier ou le dossier fourni
kill -9 PID Kill le processus ayant le pid PID (SIGKILL)
killall nom Kill les processus ayant le nom fourni
ln fic1 fic2 Lien physique du fic1 vers fic2
locate monFichier.txt Localise l'emplacement de "monFichier.txt"
man commande Affiche le manuel de la commande
ps aux Liste les processus (Cf. top/ htop)
read a b c

Lire l'entrée standard. Ici attend 3 données, exemple A\ A b C ==> $a = "A A", $b = b, $c = C

sort -r (reverse) : décroissant Trie de ligne (ordre alphabétique croissant par défaut)
-n : compare selon la valeur numérique de la chaîne
tar -cf dest.tar source Créer une archive
-xf archive.tar Désarchiver
-xf archive.tar -C /tmp Désarchiver dans le dossier /tmp
-czvf dest.tar.gz source Créer et compresser une archive
-xvzf archiver.tar.gz Désarchiver et décompresser
-xvzf archiver.tar.gz -C /tmp Désarchiver et décompresser dans le dossier /tmp
time monScript.sh Affiche le temps utilisé par le script
tr liste1 liste2 Remplace liste1 par liste2 issue de l'entrée standard et renvoie sur la sortie standard. liste1 et liste2 sont des listes de caractères.
-d : supprime les caractères de liste1
-s : supprime les caractères de liste1 répétée
uniq -d : ne garde que les lignes dupliqués Ne garde qu'une seule occurrence des lignes en doublons (distinct) (cat fic.txt | uniq)
- c : préfixe les lignes par leurs nombres d'occurrences
-i : ignore la casse
-u : garde uniquement les lignes uniques
wc -l (Line) -c(Character) -w (Word) Compte le nombre de lignes, mots ou caractères d'un texte (cat fix.txt | wc -l)
wich maCommande localise le fichier contenant maCommande
zip / unzip   zipper ou dézipper

 

Raccourcis Objectif
ctrl + z + écrire bg

Mise en arrière-plan de la tâche active

Commande inverse : jobs, fg%NumJobs

ctrl + c Envoie du signal SIGTERM (ferme le processus)
ctrl + z Freeze le processus
ctrl + l Même action que la commande "clean"
ctrl + d Écrit au clavier EOF (End Of File).
ctrl + r Regarde dans l'historique des commandes (Cf. history)
!maCommande Exécute la dernière commande commençant par maCommande