Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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

NotionPowerShellBash
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.Countt=(a b) ; "${t[0]}" ; "${#t[@]}"
Table de hachage$h = @{ cle = 'valeur' } ; $h.cledeclare -A h=([cle]=valeur) ; "${h[cle]}"
AfficherWrite-Output, Write-Host (écran seul)echo, printf '%s\n'
SaisieRead-Host 'Question'read -rp 'Question ' var
Arguments du scriptparam([string]$Serveur)$1, $2, "$@", $#, getopts
Fonctionfunction Get-Etat { param($x) … }etat() { local x=$1; … }
Quitter avec un codeexit 1exit 1

Comparaisons, conditions et boucles

NotionPowerShellBash
É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&&, ||, !
Conditionif (…) { } elseif (…) { } else { }if …; then …; elif …; then …; else …; fi
Choix multipleswitch -Wildcard ($x) { 'a*' { …; break } }case "$x" in a*) … ;; esac
Parcourirforeach ($s in $liste) { }for s in "${liste[@]}"; do …; done
Compteurfor ($i = 1; $i -le 3; $i++) { }for ((i = 1; i <= 3; i++)); do …; done
Tant quewhile (…) { }, do { } until (…)while …; do …; done, until …; do …; done
Lire un fichier ligne à ligneforeach ($l in Get-Content f.txt) { }while IFS= read -r l; do …; done < f.txt

Fichiers et texte

TâchePowerShellBash
Le fichier existe ?Test-Path $f -PathType Leaf[[ -f "$f" ]]
Le dossier existe ?Test-Path $d -PathType Container[[ -d "$d" ]]
ListerGet-ChildItem $d -Recurse -File -Filter *.logfind "$d" -type f -name '*.log'
Plus vieux que 30 joursWhere-Object LastWriteTime -lt (Get-Date).AddDays(-30)find "$d" -type f -mtime +30
Créer un dossierNew-Item $d -ItemType Directory -Forcemkdir -p "$d"
Copier, déplacerCopy-Item, Move-Itemcp, mv
Supprimer en simulationRemove-Item $f -WhatIffind … -print avant -delete
Lire, dernières lignesGet-Content $f -Tail 20tail -n 20 "$f"
Suivre un fichierGet-Content $f -Waittail -f "$f"
Écrire, ajouterSet-Content, Add-Content (avec -Encoding)>, >>
Chercher un motifSelect-String -Path $f -Pattern 'motif'grep -E 'motif' "$f"
Compter les lignes trouvées@(Select-String …).Countgrep -c 'motif' "$f"
Remplacer$t -replace 'a', 'b'sed -E 's/a/b/g'
Lire un CSVImport-Csv $f -Delimiter ';'cut -d';' -f2, awk -F';'
Écrire un CSVExport-Csv $f -Delimiter ';' -NoTypeInformationprintf '%s;%s\n' "$a" "$b" >> "$f"
Lire un JSONGet-Content $f -Raw | ConvertFrom-Jsonjq -r '.cle' "$f"
Trier, dédoublonnerSort-Object, Sort-Object -Uniquesort, sort -u
Compter par valeurGroup-Objectsort | uniq -c | sort -rn
SommeMeasure-Object -Sumawk '{ s += $1 } END { print s }'

Erreurs et journal

NotionPowerShellBash
S'arrêter à la première erreur$ErrorActionPreference = 'Stop'set -euo pipefail
Une commande précise-ErrorAction Stopcommande || exit 1
Attrapertry { } catch { $_.Exception.Message }if ! commande; then …; fi
Toujours exécuter à la finfinally { }trap nettoyer EXIT
Signaler une erreurthrow 'message', Write-Errorecho "message" >&2; exit 1
Code du dernier programme$LASTEXITCODE (et $?)$?
Journal du systèmeWrite-EventLog (5.1) ou un fichier Add-Contentlogger -t etiquette "message"
Lire le journalGet-WinEvent -LogName …journalctl -t etiquette, journalctl -u service
Simuler-WhatIf (avec SupportsShouldProcess)Une option -s du script, echo devant les commandes

Les redirections

ÉcriturePowerShellBash
Résultats dans un fichier> f.txt ou | Out-File f.txt -Encoding utf8> f.txt
Ajouter>> f.txt>> f.txt
Erreurs dans un fichier2> err.txt2> 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âchePowerShellBash
Session interactiveEnter-PSSession -ComputerName srv-adssh mdiallo@srv-web
Commande sur plusieurs machinesInvoke-Command -ComputerName a, b -ScriptBlock { … }for h in a b; do ssh "$h" '…'; done
Passer une variable$using:var ou -ArgumentListDans la chaîne envoyée : ssh h "df -h $point"
Lancer un script local à distanceInvoke-Command -FilePath .\s.ps1ssh h 'bash -s' < s.sh
CopierCopy-Item -ToSession $sscp, rsync -a -e ssh
Port5985 (HTTP), 5986 (HTTPS) ; 22 en SSH22
PlanifierRegister-ScheduledTask/etc/cron.d/… ou un .timer systemd
Dernier résultatGet-ScheduledTaskInfosystemctl status x.service

Les codes de sortie à connaître

CodeSens
0Succès, partout
1Erreur générale
2Mauvaise utilisation (Bash) ; « critique » pour un contrôle de supervision
3« Inconnu » pour un contrôle de supervision
22Erreur HTTP 400 ou plus avec curl -f
126, 127Commande non exécutable, introuvable (Bash)
130Interruption par Ctrl+C (Bash)
0 à 7 pour robocopySuccès ; échec à partir de 8
0x0, 0x1Résultat d'une tâche planifiée : succès, le script a renvoyé 1

Chapitre terminé !

Tu as lu ce chapitre jusqu'au bout. Passe au suivant tant que c'est frais.

chapitres
–
de série
–
du cours
–
Cours suivant : AnsibleRevoir le sommaire du cours