Skip to main content

Variables and data types


Table of contents

  1. Declaration and assignment
  2. Variable expansion
  3. Environment variables
  4. Arrays
  5. Associative arrays
  6. 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

TypeExpansionUsage
"..."YesPreserves spaces, expands variables
'...'NoLiteral, no expansion
`...`CommandOld 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

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

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

VariableDescription
$HOMEHome directory
$USERUsername
$PATHSearch paths
$PWDCurrent directory
$SHELLDefault shell
$HOSTNAMEMachine name
$RANDOMRandom number
$SECONDSSeconds 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 -A is required
  • Always use "${array[@]}" with quotes

🔝 Back to table of contents


← Previous chapter | Next chapter: Conditions →