Bases du scripting
#!/usr/bin/env bash
set -euo pipefail| Flag | Effet |
|---|---|
set -e | Arrêter si une commande échoue |
set -u | Erreur si une variable est non définie |
set -o pipefail | Un pipe échoue si n'importe quelle commande échoue |
Variables
# Declaration
NAME="Mouctar"
readonly VERSION="1.0.0"
# Utilisation
echo "Hello $NAME"
echo "Version: ${VERSION}"
# Variables d'environnement
export DATABASE_URL="postgres://localhost:5432/mydb"
# Substitution par defaut
echo "${PORT:-3000}" # 3000 si PORT est vide ou non défini
echo "${PORT:=3000}" # Assigne 3000 si non définiConditions
# Test de chaine
if [[ "$ENV" == "production" ]]; then
echo "Production mode"
elif [[ "$ENV" == "staging" ]]; then
echo "Staging mode"
else
echo "Development mode"
fi
# Test de fichier
[[ -f "config.yml" ]] # Le fichier existe
[[ -d "/var/log" ]] # Le répertoire existe
[[ -x "script.sh" ]] # Le fichier est executable
[[ -z "$VAR" ]] # La variable est vide
[[ -n "$VAR" ]] # La variable n'est pas vide
# Tests numeriques
[[ "$COUNT" -gt 10 ]] # Greater than
[[ "$COUNT" -le 5 ]] # Less than or equal
[[ "$COUNT" -eq 0 ]] # EqualBoucles
# For
for file in *.log; do
echo "Processing $file"
done
# For avec sequence
for i in {1..10}; do
echo "Iteration $i"
done
# While
while read -r line; do
echo "Line: $line"
done < input.txt
# Until
until kubectl get pods | grep -q "Running"; do
echo "Waiting for pod..."
sleep 5
doneFonctions
deploy() {
local env="${1:?Usage: deploy <environment>}"
local version="${2:-latest}"
echo "Deploying version $version to $env"
# ...
}
deploy "production" "v2.1.0"Pipes et redirections
$cat access.log | grep 'ERROR' | sort | uniq -c | sort -rn | head -10
Top 10 des erreurs les plus fréquentes
# Redirections
command > output.txt # Stdout vers fichier (ecrase)
command >> output.txt # Stdout vers fichier (ajoute)
command 2> error.txt # Stderr vers fichier
command &> all.txt # Stdout + stderr vers fichier
command 2>&1 # Stderr vers stdoutManipulation de texte
$grep -r 'TODO' src/ --include='*.ts'
Chercher TODO dans les fichiers TypeScript
$sed -i 's/old/new/g' fichier.txt
Remplacer 'old' par 'new' dans un fichier
$awk '{print $1, $NF}' access.log
Afficher le premier et dernier champ
$cut -d',' -f1,3 data.csv
Extraire les colonnes 1 et 3 d'un CSV
$sort fichier.txt | uniq -c | sort -rn
Compter les occurrences et trier
Process management
$ps aux | grep nginx
$kill -15 1234
SIGTERM — arrêt propre
$kill -9 1234
SIGKILL — arrêt forcé (dernier recours)
$nohup ./script.sh &
Exécuter en arrière-plan, survit à la déconnexion
$jobs -l
Lister les jobs en arrière-plan
Commandes utiles
$xargs -I{} -P4 curl -s {} < urls.txt
Requêtes parallèles (4 à la fois)
$watch -n 5 'kubectl get pods'
Exécuter une commande toutes les 5 secondes
$timeout 30 ./long-script.sh
Limiter l'exécution à 30 secondes
$date -u +%Y-%m-%dT%H:%M:%SZ
Date au format ISO 8601 UTC
$du -sh */ | sort -rh | head -10
Top 10 des répertoires les plus volumineux
Script template
#!/usr/bin/env bash
set -euo pipefail
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
usage() {
cat <<EOF
Usage: $SCRIPT_NAME [options] <argument>
Options:
-e, --env ENV Target environment (default: staging)
-v, --verbose Enable verbose output
-h, --help Show this help message
EOF
}
main() {
local env="staging"
local verbose=false
while [[ $# -gt 0 ]]; do
case "$1" in
-e|--env) env="$2"; shift 2 ;;
-v|--verbose) verbose=true; shift ;;
-h|--help) usage; exit 0 ;;
*) echo "Unknown option: $1"; usage; exit 1 ;;
esac
done
if [[ "$verbose" == true ]]; then
set -x
fi
echo "Deploying to $env..."
}
main "$@"