Aller au contenu principal

Variables et types de données


Table des matières

  1. Déclaration et affectation
  2. Expansion de variables
  3. Variables d'environnement
  4. Tableaux
  5. Tableaux associatifs
  6. 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

TypeExpansionUsage
"..."OuiPréserve les espaces, expand les variables
'...'NonLittéral, aucune expansion
`...`CommandeAncienne 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

SyntaxeDescription
${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

SyntaxeDescription
${#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

VariableDescription
$HOMERépertoire home
$USERNom d'utilisateur
$PATHChemins de recherche
$PWDRépertoire courant
$SHELLShell par défaut
$HOSTNAMENom de la machine
$RANDOMNombre aléatoire
$SECONDSSecondes 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 -A obligatoire
  • Toujours utiliser "${array[@]}" avec guillemets

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Conditions →