Variables and data types
Table of contents
- Declaration and assignment
- Variable expansion
- Environment variables
- Arrays
- Associative arrays
- Practical exercises
1 - Declaration and assignment
Basic syntax
# Affectation (PAS D'ESPACE autour du =)
nom="valeur"
# Incorrect !
nom = "valeur" # Erreur: commande 'nom' non trouvée
Value types
# 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=""
Quotes
| Type | Expansion | Usage |
|---|---|---|
"..." | Yes | Preserves spaces, expands variables |
'...' | No | Literal, no expansion |
`...` | Command | Old syntax for $(...) |
nom="Alice"
echo "Bonjour $nom" # Bonjour Alice
echo 'Bonjour $nom' # Bonjour $nom
echo "Date: $(date)" # Date: Mon Jan 15 ...
Read-only variables
readonly PI=3.14159
PI=3 # Erreur: PI: readonly variable
declare -r CONSTANTE="valeur"
Delete a variable
ma_var="test"
unset ma_var
echo $ma_var # (vide)
🔝 Back to table of contents
2 - Variable expansion
Expansion syntax
nom="Alice"
# Simple
echo $nom # Alice
echo ${nom} # Alice (recommandé)
# Concaténation
echo ${nom}_fichier # Alice_fichier
echo $nom_fichier # (vide - cherche $nom_fichier)
Default values
| Syntax | Description |
|---|---|
${var:-default} | Uses default if var is empty or unset |
${var:=default} | Same + assigns default to var |
${var:+alternate} | Uses alternate if var is set |
${var:?error} | Displays error if var is empty |
# 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"}
String manipulation
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 -
Summary table
| Syntax | Description |
|---|---|
${#var} | Length |
${var#pattern} | Remove short prefix |
${var##pattern} | Remove long prefix |
${var%pattern} | Remove short suffix |
${var%%pattern} | Remove long suffix |
${var:pos:len} | Substring |
${var/old/new} | Replace first |
${var//old/new} | Replace all |
🔝 Back to table of contents
3 - Environment variables
Common variables
| Variable | Description |
|---|---|
$HOME | Home directory |
$USER | Username |
$PATH | Search paths |
$PWD | Current directory |
$SHELL | Default shell |
$HOSTNAME | Machine name |
$RANDOM | Random number |
$SECONDS | Seconds since the script started |
Export variables
# Variable locale
ma_var="locale"
# Variable exportée (disponible aux sous-processus)
export MA_VAR="exportée"
# Vérifier
env | grep MA_VAR
Modify PATH
# Ajouter un répertoire au PATH
export PATH="$PATH:/mon/chemin"
# Ajouter au début
export PATH="/mon/chemin:$PATH"
🔝 Back to table of contents
4 - Arrays
Declaration
# 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)
Accessing elements
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
Iteration
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)
🔝 Back to table of contents
5 - Associative arrays
Declaration
# Obligatoire: declare -A
declare -A utilisateur
utilisateur[nom]="Alice"
utilisateur[age]=30
utilisateur[ville]="Paris"
Access
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
Iteration
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
Practical example
#!/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
🔝 Back to table of contents
6 - Practical exercises
Exercise 1: String manipulation
# 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
Exercise 2: Array
# 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. What is the difference between ${var:-default} and ${var:=default}?
Answer
:- uses the default value without modifying var.
:= uses the default value AND assigns it to var.
Q2. How do you get the length of a string?
Answer
${#variable}
Q3. How do you declare an associative array?
Answer
declare -A mon_tableau
🔝 Back to table of contents
Key takeaways
- No space around the
=when assigning - Use
${var}to avoid ambiguity ${var:-default}for default values${#var}= length,${var:pos:len}= substring- Indexed arrays:
array=(a b c), access${array[0]} - Associative arrays:
declare -Ais required - Always use
"${array[@]}"with quotes