Scripting & Outils

Shell & Bash

Cheatsheet Shell/Bash — scripting, variables, boucles, conditions et commandes utiles

shellbashscriptinglinuxautomation

Bases du scripting

#!/usr/bin/env bash
set -euo pipefail
FlagEffet
set -eArrêter si une commande échoue
set -uErreur si une variable est non définie
set -o pipefailUn 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éfini

Conditions

# 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 ]]     # Equal

Boucles

# 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
done

Fonctions

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 stdout

Manipulation 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 "$@"