Chapitre 177 minDébutant
Aide-mémoire : équivalences PowerShell et Bash
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- retrouver vite l'équivalent d'une commande dans l'autre langage ;
- retenir les codes de sortie et les redirections ;
- réviser les commandes d'exécution à distance et de planification.
Cet aide-mémoire regroupe les équivalences entre PowerShell et Bash pour les tâches courantes d'un script d'administration : la syntaxe, les fichiers, le texte, les erreurs, l'exécution à distance et la planification. Chaque ligne renvoie à la notion expliquée dans les chapitres précédents.
La syntaxe de base
| Notion | PowerShell | Bash |
|---|---|---|
| Première ligne | #Requires -Version 5.1 (facultatif) | #!/usr/bin/env bash (obligatoire) |
| Commentaire | #, ou <# … #> sur plusieurs lignes | # |
| Affecter | $nom = 'srv-web' | nom="srv-web" (sans espace) |
| Lire | $nom, "Serveur $nom", "$($obj.Prop)" | "$nom", "${nom}_bis" |
| Sortie d'une commande | $d = Get-Date -Format 'yyyy-MM-dd' | d=$(date +%F) |
| Calcul | $a + $b, 17 % 5, [math]::Round($x, 1) | $(( a + b )), $(( 17 % 5 )) (entiers) |
| Tableau | $t = 'a', 'b' ; $t[0] ; $t.Count | t=(a b) ; "${t[0]}" ; "${#t[@]}" |
| Table de hachage | $h = @{ cle = 'valeur' } ; $h.cle | declare -A h=([cle]=valeur) ; "${h[cle]}" |
| Afficher | Write-Output, Write-Host (écran seul) | echo, printf '%s\n' |
| Saisie | Read-Host 'Question' | read -rp 'Question ' var |
| Arguments du script | param([string]$Serveur) | $1, $2, "$@", $#, getopts |
| Fonction | function Get-Etat { param($x) … } | etat() { local x=$1; … } |
| Quitter avec un code | exit 1 | exit 1 |
Comparaisons, conditions et boucles
| Notion | PowerShell | Bash |
|---|---|---|
| Égal, différent | -eq, -ne (sans casse ; -ceq avec) | ==, != dans [[ ]] ; -eq pour des nombres |
| Plus petit, plus grand | -lt, -le, -gt, -ge | -lt, -gt… dans [[ ]], ou <, > dans (( )) |
| Joker | -like 'srv-*' | [[ $n == srv-* ]] |
| Regex | -match '^PC-\d{4}$' puis $Matches | [[ $n =~ $motif ]] puis BASH_REMATCH |
| Et, ou, non | -and, -or, -not | &&, ||, ! |
| Condition | if (…) { } elseif (…) { } else { } | if …; then …; elif …; then …; else …; fi |
| Choix multiple | switch -Wildcard ($x) { 'a*' { …; break } } | case "$x" in a*) … ;; esac |
| Parcourir | foreach ($s in $liste) { } | for s in "${liste[@]}"; do …; done |
| Compteur | for ($i = 1; $i -le 3; $i++) { } | for ((i = 1; i <= 3; i++)); do …; done |
| Tant que | while (…) { }, do { } until (…) | while …; do …; done, until …; do …; done |
| Lire un fichier ligne à ligne | foreach ($l in Get-Content f.txt) { } | while IFS= read -r l; do …; done < f.txt |
Fichiers et texte
| Tâche | PowerShell | Bash |
|---|---|---|
| Le fichier existe ? | Test-Path $f -PathType Leaf | [[ -f "$f" ]] |
| Le dossier existe ? | Test-Path $d -PathType Container | [[ -d "$d" ]] |
| Lister | Get-ChildItem $d -Recurse -File -Filter *.log | find "$d" -type f -name '*.log' |
| Plus vieux que 30 jours | Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) | find "$d" -type f -mtime +30 |
| Créer un dossier | New-Item $d -ItemType Directory -Force | mkdir -p "$d" |
| Copier, déplacer | Copy-Item, Move-Item | cp, mv |
| Supprimer en simulation | Remove-Item $f -WhatIf | find … -print avant -delete |
| Lire, dernières lignes | Get-Content $f -Tail 20 | tail -n 20 "$f" |
| Suivre un fichier | Get-Content $f -Wait | tail -f "$f" |
| Écrire, ajouter | Set-Content, Add-Content (avec -Encoding) | >, >> |
| Chercher un motif | Select-String -Path $f -Pattern 'motif' | grep -E 'motif' "$f" |
| Compter les lignes trouvées | @(Select-String …).Count | grep -c 'motif' "$f" |
| Remplacer | $t -replace 'a', 'b' | sed -E 's/a/b/g' |
| Lire un CSV | Import-Csv $f -Delimiter ';' | cut -d';' -f2, awk -F';' |
| Écrire un CSV | Export-Csv $f -Delimiter ';' -NoTypeInformation | printf '%s;%s\n' "$a" "$b" >> "$f" |
| Lire un JSON | Get-Content $f -Raw | ConvertFrom-Json | jq -r '.cle' "$f" |
| Trier, dédoublonner | Sort-Object, Sort-Object -Unique | sort, sort -u |
| Compter par valeur | Group-Object | sort | uniq -c | sort -rn |
| Somme | Measure-Object -Sum | awk '{ s += $1 } END { print s }' |
Erreurs et journal
| Notion | PowerShell | Bash |
|---|---|---|
| S'arrêter à la première erreur | $ErrorActionPreference = 'Stop' | set -euo pipefail |
| Une commande précise | -ErrorAction Stop | commande || exit 1 |
| Attraper | try { } catch { $_.Exception.Message } | if ! commande; then …; fi |
| Toujours exécuter à la fin | finally { } | trap nettoyer EXIT |
| Signaler une erreur | throw 'message', Write-Error | echo "message" >&2; exit 1 |
| Code du dernier programme | $LASTEXITCODE (et $?) | $? |
| Journal du système | Write-EventLog (5.1) ou un fichier Add-Content | logger -t etiquette "message" |
| Lire le journal | Get-WinEvent -LogName … | journalctl -t etiquette, journalctl -u service |
| Simuler | -WhatIf (avec SupportsShouldProcess) | Une option -s du script, echo devant les commandes |
Les redirections
| Écriture | PowerShell | Bash |
|---|---|---|
| Résultats dans un fichier | > f.txt ou | Out-File f.txt -Encoding utf8 | > f.txt |
| Ajouter | >> f.txt | >> f.txt |
| Erreurs dans un fichier | 2> err.txt | 2> err.txt |
| Tout dans un fichier | *> tout.txt | > tout.txt 2>&1 ou &> tout.txt |
| Jeter | | Out-Null, $null = … | > /dev/null |
À distance et planification
| Tâche | PowerShell | Bash |
|---|---|---|
| Session interactive | Enter-PSSession -ComputerName srv-ad | ssh mdiallo@srv-web |
| Commande sur plusieurs machines | Invoke-Command -ComputerName a, b -ScriptBlock { … } | for h in a b; do ssh "$h" '…'; done |
| Passer une variable | $using:var ou -ArgumentList | Dans la chaîne envoyée : ssh h "df -h $point" |
| Lancer un script local à distance | Invoke-Command -FilePath .\s.ps1 | ssh h 'bash -s' < s.sh |
| Copier | Copy-Item -ToSession $s | scp, rsync -a -e ssh |
| Port | 5985 (HTTP), 5986 (HTTPS) ; 22 en SSH | 22 |
| Planifier | Register-ScheduledTask | /etc/cron.d/… ou un .timer systemd |
| Dernier résultat | Get-ScheduledTaskInfo | systemctl status x.service |
Les codes de sortie à connaître
| Code | Sens |
|---|---|
0 | Succès, partout |
1 | Erreur générale |
2 | Mauvaise utilisation (Bash) ; « critique » pour un contrôle de supervision |
3 | « Inconnu » pour un contrôle de supervision |
22 | Erreur HTTP 400 ou plus avec curl -f |
126, 127 | Commande non exécutable, introuvable (Bash) |
130 | Interruption par Ctrl+C (Bash) |
0 à 7 pour robocopy | Succès ; échec à partir de 8 |
0x0, 0x1 | Résultat d'une tâche planifiée : succès, le script a renvoyé 1 |