Variables et types de données
Table des matières
- Déclaration et affectation
- Expansion de variables
- Variables d'environnement
- Tableaux
- Tableaux associatifs
- Exercices pratiques
1 - Déclaration et affectation
Syntaxe de base
# Affectation (PAS D'ESPACE autour du =)
nom="valeur"
# Incorrect !
nom = "valeur" # Erreur: commande 'nom' non trouvée
Types de valeurs
# Chaîne de caractères
message="Hello World"
chemin="/home/user"
# Nombre
compteur=42
port=8080
# Commande (substitution)
date_actuelle=$(date)
fichiers=$(ls -la)
# Vide
variable_vide=""
Guillemets
| Type | Expansion | Usage |
|---|---|---|
"..." | Oui | Préserve les espaces, expand les variables |
'...' | Non | Littéral, aucune expansion |
`...` | Commande | Ancienne syntaxe pour $(...) |
nom="Alice"
echo "Bonjour $nom" # Bonjour Alice
echo 'Bonjour $nom' # Bonjour $nom
echo "Date: $(date)" # Date: Mon Jan 15 ...
Variables en lecture seule
readonly PI=3.14159
PI=3 # Erreur: PI: readonly variable
declare -r CONSTANTE="valeur"
Supprimer une variable
ma_var="test"
unset ma_var
echo $ma_var # (vide)
🔝 Retour à la table des matières
2 - Expansion de variables
Syntaxe d'expansion
nom="Alice"
# Simple
echo $nom # Alice
echo ${nom} # Alice (recommandé)
# Concaténation
echo ${nom}_fichier # Alice_fichier
echo $nom_fichier # (vide - cherche $nom_fichier)
Valeurs par défaut
| Syntaxe | Description |
|---|---|
${var:-default} | Utilise default si var est vide ou non définie |
${var:=default} | Idem + assigne default à var |
${var:+alternate} | Utilise alternate si var est définie |
${var:?error} | Affiche error si var est vide |
# Valeur par défaut
echo ${nom:-"Inconnu"} # Alice (car nom est défini)
echo ${age:-18} # 18 (car age n'est pas défini)
# Assigner si vide
echo ${config:=/etc/default.conf}
# Erreur si vide
echo ${required_var:?"Variable required_var obligatoire"}
Manipulation de chaînes
fichier="/home/user/documents/rapport.pdf"
# Longueur
echo ${#fichier} # 32
# Suppression de préfixe
echo ${fichier#*/} # home/user/documents/rapport.pdf
echo ${fichier##*/} # rapport.pdf (le plus long)
# Suppression de suffixe
echo ${fichier%/*} # /home/user/documents
echo ${fichier%%/*} # (vide)
# Extraction de sous-chaîne
text="Hello World"
echo ${text:0:5} # Hello (position:longueur)
echo ${text:6} # World (depuis position)
# Remplacement
echo ${fichier/.pdf/.txt} # Remplace premier .pdf
echo ${fichier//./-} # Remplace tous les . par -
Tableau récapitulatif
| Syntaxe | Description |
|---|---|
${#var} | Longueur |
${var#pattern} | Supprime préfixe court |
${var##pattern} | Supprime préfixe long |
${var%pattern} | Supprime suffixe court |
${var%%pattern} | Supprime suffixe long |
${var:pos:len} | Sous-chaîne |
${var/old/new} | Remplace premier |
${var//old/new} | Remplace tous |
🔝 Retour à la table des matières
3 - Variables d'environnement
Variables courantes
| Variable | Description |
|---|---|
$HOME | Répertoire home |
$USER | Nom d'utilisateur |
$PATH | Chemins de recherche |
$PWD | Répertoire courant |
$SHELL | Shell par défaut |
$HOSTNAME | Nom de la machine |
$RANDOM | Nombre aléatoire |
$SECONDS | Secondes depuis le démarrage du script |
Exporter des variables
# Variable locale
ma_var="locale"
# Variable exportée (disponible aux sous-processus)
export MA_VAR="exportée"
# Vérifier
env | grep MA_VAR
Modifier PATH
# Ajouter un répertoire au PATH
export PATH="$PATH:/mon/chemin"
# Ajouter au début
export PATH="/mon/chemin:$PATH"
🔝 Retour à la table des matières
4 - Tableaux
Déclaration
# Méthode 1: Liste
fruits=("pomme" "banane" "orange")
# Méthode 2: Indices explicites
couleurs[0]="rouge"
couleurs[1]="vert"
couleurs[2]="bleu"
# Méthode 3: declare
declare -a nombres=(1 2 3 4 5)
Accès aux éléments
fruits=("pomme" "banane" "orange")
# Un élément
echo ${fruits[0]} # pomme
echo ${fruits[1]} # banane
# Tous les éléments
echo ${fruits[@]} # pomme banane orange
echo ${fruits[*]} # pomme banane orange
# Nombre d'éléments
echo ${#fruits[@]} # 3
# Longueur d'un élément
echo ${#fruits[0]} # 5 (longueur de "pomme")
Modification
fruits=("pomme" "banane" "orange")
# Modifier un élément
fruits[1]="kiwi"
# Ajouter un élément
fruits+=("mangue")
# Supprimer un élément
unset fruits[0]
# Afficher
echo ${fruits[@]} # kiwi orange mangue
Itération
fruits=("pomme" "banane" "orange")
# Boucle sur les valeurs
for fruit in "${fruits[@]}"; do
echo "Fruit: $fruit"
done
# Boucle sur les indices
for i in "${!fruits[@]}"; do
echo "[$i] = ${fruits[$i]}"
done
Slicing
nombres=(0 1 2 3 4 5 6 7 8 9)
# Sous-tableau
echo ${nombres[@]:3:4} # 3 4 5 6 (depuis 3, longueur 4)
echo ${nombres[@]:5} # 5 6 7 8 9 (depuis 5)
🔝 Retour à la table des matières
5 - Tableaux associatifs
Déclaration
# Obligatoire: declare -A
declare -A utilisateur
utilisateur[nom]="Alice"
utilisateur[age]=30
utilisateur[ville]="Paris"
Accès
declare -A config=(
[host]="localhost"
[port]="8080"
[user]="admin"
)
# Un élément
echo ${config[host]} # localhost
# Toutes les clés
echo ${!config[@]} # host port user
# Toutes les valeurs
echo ${config[@]} # localhost 8080 admin
# Nombre d'éléments
echo ${#config[@]} # 3
Itération
declare -A config=(
[host]="localhost"
[port]="8080"
[user]="admin"
)
# Itérer sur clés et valeurs
for key in "${!config[@]}"; do
echo "$key = ${config[$key]}"
done
Exemple pratique
#!/bin/bash
declare -A SERVERS=(
[web]="192.168.1.10"
[db]="192.168.1.20"
[cache]="192.168.1.30"
)
for name in "${!SERVERS[@]}"; do
ip="${SERVERS[$name]}"
echo "Ping $name ($ip)..."
ping -c 1 "$ip" > /dev/null 2>&1 && echo " OK" || echo " FAIL"
done
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Manipulation de chaînes
# Soit la variable:
path="/var/log/apache2/access.log"
# Extraire:
# 1. Le nom du fichier (access.log)
# 2. L'extension (.log)
# 3. Le répertoire parent (/var/log/apache2)
Solution
path="/var/log/apache2/access.log"
echo ${path##*/} # access.log
echo ${path##*.} # log
echo ${path%/*} # /var/log/apache2
Exercice 2 : Tableau
# Créez un script qui:
# 1. Déclare un tableau de 5 serveurs
# 2. Affiche le nombre de serveurs
# 3. Itère et affiche chaque serveur
Solution
#!/bin/bash
servers=("web1" "web2" "db1" "cache1" "api1")
echo "Nombre de serveurs: ${#servers[@]}"
for server in "${servers[@]}"; do
echo "- $server"
done
Quiz
Q1. Quelle est la différence entre ${var:-default} et ${var:=default} ?
Réponse
:- utilise la valeur par défaut sans modifier var.
:= utilise la valeur par défaut ET l'assigne à var.
Q2. Comment obtenir la longueur d'une chaîne ?
Réponse
${#variable}
Q3. Comment déclarer un tableau associatif ?
Réponse
declare -A mon_tableau
🔝 Retour à la table des matières
Points clés à retenir
- Pas d'espace autour du
=lors de l'affectation - Utiliser
${var}pour éviter les ambiguïtés ${var:-default}pour les valeurs par défaut${#var}= longueur,${var:pos:len}= sous-chaîne- Tableaux indexés:
array=(a b c), accès${array[0]} - Tableaux associatifs:
declare -Aobligatoire - Toujours utiliser
"${array[@]}"avec guillemets