Aller au contenu
Réussir mon BTS SIO

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

Par exemple

Chapitre 114 minDébutant

C'est quoi un script ? PowerShell ou Bash

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • expliquer ce qu'est un script et ce qu'il apporte à un administrateur ;
  • choisir entre PowerShell et Bash selon la tâche et la machine cible ;
  • écrire, lancer et dépanner ton premier script dans chaque langage ;
  • présenter un script avec un en-tête et des conventions de nommage.

3 exercices corrigés

Un script est un fichier texte qui contient une suite de commandes, exécutées l'une après l'autre par un interpréteur de commandes (le shell) comme si tu les tapais toi-même. Ce chapitre explique pourquoi un administrateur écrit des scripts, ce qui distingue PowerShell de Bash, puis te fait écrire et lancer ton premier script dans chaque langage, en évitant les trois erreurs qui bloquent tous les débutants.

Pourquoi écrire un script

Lundi matin chez Sorbier Logistique, Chloé Lambert reçoit la liste des douze saisonniers qui arrivent à l'entrepôt : il faut un compte dans l'annuaire pour chacun, dans la bonne unité d'organisation, membre du bon groupe, avec un mot de passe initial à changer. À la souris, c'est une heure de clics et au moins une faute de frappe. Avec un script qui lit la liste, c'est dix secondes, et le même script resservira en janvier, à la fin de leurs contrats, pour les désactiver.

Un script apporte quatre choses que le travail à la main n'apporte pas.

  • La vitesse. Ce qui se répète (créer des comptes, vérifier vingt serveurs, archiver des journaux) se fait en une commande.
  • La fiabilité. Le script fait exactement la même chose à chaque exécution. Il ne saute pas une étape un vendredi soir.
  • La traçabilité. Un script bien écrit note ce qu'il a fait dans un journal : qui, quoi, quand, avec quel résultat.
  • La documentation. Le script est la procédure : un collègue qui le lit sait comment la tâche se fait, et peut la refaire.

Shell, interpréteur et langage de commande

Le shell est le programme qui lit tes commandes, les interprète et lance les programmes demandés. Tu le croises dans une fenêtre de terminal, en mode interactif : tu tapes, il répond. Un script, c'est le même shell qui lit ses commandes dans un fichier au lieu de les lire au clavier.

ShellSystèmeFichiers de scriptCe qu'il manipuleOù tu le croises
PowerShell 7 (pwsh)Windows, Linux, macOS.ps1Des objets .NETAdministration Windows, Microsoft 365, Azure, scripts multiplateformes
Windows PowerShell 5.1 (powershell.exe)Windows.ps1Des objets .NETInstallé sur tous les Windows et Windows Server actuels
BashLinux, macOS, WSL.shDu texteServeurs Linux, conteneurs, pipelines CI/CD
sh (dash sur Debian)Linux.shDu texteScripts système minimalistes et portables
cmd.exeWindows.bat, .cmdDu texteVieux scripts d'ouverture de session, à remplacer
zshmacOS, Linux.zshDu texteShell interactif par défaut de macOS

Bash (Bourne Again Shell) est le shell par défaut des comptes utilisateurs sur Debian et Ubuntu. Debian 13 fournit Bash 5.2. Attention, /bin/sh n'est pas Bash sur Debian : c'est dash, un shell plus léger qui ne connaît pas les extensions de Bash comme [[ ]] ou les tableaux. Un script Bash doit donc être lancé par Bash, ce que garantit sa première ligne.

PowerShell ou Bash : des objets ou du texte

La vraie différence entre les deux langages n'est pas la syntaxe, c'est ce qui circule entre les commandes.

En Bash, chaque commande produit du texte. Pour récupérer une information, tu découpes ce texte : la cinquième colonne, la ligne qui contient tel mot. Voici les services en échec sur un serveur Debian :

bash
systemctl list-units --type=service --state=failed --no-legend | awk '{print $2}'

Si l'affichage de la commande change d'une version à l'autre, le découpage casse.

En PowerShell, chaque commande produit des objets, avec des propriétés nommées. Pour récupérer une information, tu demandes la propriété par son nom. Voici les services arrêtés alors qu'ils devraient démarrer automatiquement, sur un serveur Windows :

powershell
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } |
    Select-Object Name, DisplayName

Rien n'est découpé : Status et StartType sont des propriétés de chaque service. Le chapitre 3 détaille ce fonctionnement.

CritèrePowerShellBash
Ce qui circule dans le pipelineDes objets typésDu texte
Système de prédilectionWindows, Microsoft 365, AzureLinux, conteneurs, équipements réseau
Syntaxe des commandesVerbe-Nom -Paramètre valeurcommande -option argument
Sensibilité à la casseNon (Get-Service = get-service)Oui (ls n'est pas LS)
Outils pour le texte-match, -replace, Select-Stringgrep, sed, awk, cut
Fichiers structurésImport-Csv, ConvertFrom-Json intégrésjq pour le JSON, awk pour le CSV
Exécution à distanceWinRM ou SSHSSH

On choisit selon la cible : un script qui administre l'annuaire Active Directory s'écrit en PowerShell, un script qui sauvegarde un serveur web Debian s'écrit en Bash. PowerShell 7 tourne aussi sous Linux, mais sur un serveur Debian, Bash est déjà là, partout, et tous les collègues le lisent.

Ton premier script PowerShell

Ouvre un terminal PowerShell, crée un dossier de travail et un premier fichier. Avec Visual Studio Code, ou même le Bloc-notes, écris Bonjour.ps1 :

powershell
# Bonjour.ps1 : mon premier script
$poste = $env:COMPUTERNAME
$date  = Get-Date -Format 'dd/MM/yyyy HH:mm'
Write-Output "Bonjour $env:USERNAME, tu es sur $poste. Nous sommes le $date."

Lance-le depuis le dossier où il se trouve :

powershell
.\Bonjour.ps1
text
Bonjour clambert, tu es sur PC-ADMIN01. Nous sommes le 03/11/2026 09:14.

Le .\ veut dire « dans le dossier courant ». Il est obligatoire : PowerShell ne lance jamais un script du dossier courant sans lui, pour éviter qu'un fichier piégé nommé comme une commande courante soit exécuté par erreur.

Deux messages arrêtent presque tous les débutants :

MessageCauseSolution
Bonjour.ps1 : Le terme « Bonjour.ps1 » n'est pas reconnu comme nom d'applet de commande…Tu as tapé Bonjour.ps1 sans .\Tape .\Bonjour.ps1, ou le chemin complet
… ne peut pas être chargé car l'exécution de scripts est désactivée sur ce systèmeLa stratégie d'exécution vaut Restricted, la valeur par défaut de Windows PowerShell 5.1 sur Windows 10 et 11 (PowerShell 7 est installé avec RemoteSigned)Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned, expliqué au chapitre 15

Ces messages sont ceux de Windows PowerShell 5.1 sur un Windows en français. PowerShell 7 les affiche en anglais (« The term 'Bonjour.ps1' is not recognized… », « …cannot be loaded because running scripts is disabled on this system »).

Sur Windows Server, la stratégie par défaut est déjà RemoteSigned : tes scripts locaux s'exécutent, ceux téléchargés d'Internet doivent être signés. PowerShell 7 installé sous Windows démarre lui aussi en RemoteSigned : son fichier powershell.config.json, dans le dossier d'installation, fixe cette valeur.

Ton premier script Bash

Sur ton serveur ou ta machine virtuelle Debian 13, crée bonjour.sh avec un éditeur (nano bonjour.sh) :

bash
#!/usr/bin/env bash
# bonjour.sh : mon premier script
machine=$(hostname)
date_jour=$(date '+%d/%m/%Y %H:%M')
echo "Bonjour $USER, tu es sur $machine. Nous sommes le $date_jour."

La première ligne, le shebang (#!), dit au système quel interpréteur doit lire le fichier. #!/usr/bin/env bash cherche bash dans le PATH ; #!/bin/bash donne son chemin directement. Les deux fonctionnent sur Debian. Sans shebang, le script lancé par ./bonjour.sh est lu par le shell courant, ce qui marche par hasard dans un terminal Bash et échoue ailleurs.

Rends le fichier exécutable, puis lance-le :

bash
chmod +x bonjour.sh
./bonjour.sh
text
Bonjour mdiallo, tu es sur srv-web. Nous sommes le 03/11/2026 09:14.
MessageCauseSolution
bash: ./bonjour.sh: Permission non accordéeLe fichier n'a pas le droit d'exécutionchmod +x bonjour.sh, ou bash bonjour.sh
bonjour.sh : commande introuvableTu as tapé bonjour.sh sans ./ : le shell ne cherche que dans les dossiers du PATH./bonjour.sh
/usr/bin/env: « bash\r »: Aucun fichier ou dossier de ce nomLe fichier a été écrit sous Windows, avec des fins de ligne CRLFRepasse-le en LF (sed -i 's/\r$//' bonjour.sh, ou le bouton « CRLF » en bas de VS Code)

Les messages sont en français si la langue du système est le français, en anglais sinon (Permission denied, command not found). Le cours Linux détaille les droits rwx que modifie chmod.

L'éditeur et l'encodage

Écris tes scripts dans Visual Studio Code, avec deux extensions : PowerShell (de Microsoft : coloration, autocomplétion, débogueur, analyse avec PSScriptAnalyzer) et ShellCheck (qui signale les erreurs classiques des scripts Bash). L'ancien éditeur Windows PowerShell ISE ne gère pas PowerShell 7 et n'évolue plus : Microsoft recommande VS Code.

Pour l'encodage, enregistre en UTF-8. Une seule exception, et elle mord souvent : un script .ps1 qui contient des caractères accentués et qui doit tourner dans Windows PowerShell 5.1 doit être enregistré en UTF-8 avec BOM. Sans BOM, Windows PowerShell 5.1 lit le fichier dans l'ancien jeu de caractères Windows (ANSI) et affiche « Résumé » au lieu de « Résumé ». PowerShell 7 lit correctement les deux.

Commenter et présenter un script

Un script d'administration sera relu, par toi dans six mois ou par un collègue en pleine panne. Donne-lui un en-tête qui dit ce qu'il fait, comment le lancer et ce dont il a besoin.

powershell
<#
.SYNOPSIS
    Liste les services automatiques arrêtés sur le serveur.
.DESCRIPTION
    À lancer après un redémarrage, pour vérifier que tout est reparti.
.EXAMPLE
    .\Get-ServicesArretes.ps1
.NOTES
    Auteur : Chloé Lambert, service informatique. Version 1.1, 03/11/2026.
#>

Cet en-tête n'est pas un simple commentaire : c'est l'aide intégrée du script, que Get-Help .\Get-ServicesArretes.ps1 -Full affiche comme celle d'une commande de Microsoft. En Bash, l'usage est un bloc de commentaires après le shebang, et une option -h qui affiche l'aide (chapitre 6).

Les conventions de nommage aident aussi à s'y retrouver :

PowerShellBash
Nom de fichierVerbe-Nom.ps1 avec un verbe approuvé : New-ComptesSaisonniers.ps1minuscules et tirets : sauvegarde-config.sh
Variables$nomComplet, $cheminRapportnom_complet ; MAJUSCULES pour les constantes et l'environnement (RETENTION_JOURS)
Commentaire# sur une ligne, <# … #> sur plusieurs#
Où ranger les scriptsC:\Scripts, ou un partage en lecture seule pour les utilisateurs/usr/local/sbin pour les scripts d'administration, /usr/local/bin pour tous

Écrire un script d'administration : la méthode

Un script ne s'écrit pas d'un seul jet. Les administrateurs suivent toujours le même chemin.

  1. Faire la tâche une fois à la main, en notant chaque commande qui marche.
  2. Assembler ces commandes dans un fichier et le relancer sur une machine de test.
  3. Remplacer les valeurs écrites en dur (nom du serveur, chemin, nombre de jours) par des variables, puis par des paramètres.
  4. Gérer les erreurs : que se passe-t-il si le dossier n'existe pas, si le serveur ne répond pas, si le fichier est vide (chapitre 7) ?
  5. Journaliser : écrire ce qui a été fait, et renvoyer un code de sortie qui dit si tout s'est bien passé.
  6. Tester sans risque (-WhatIf en PowerShell, une option --simulation en Bash) avant de lancer pour de vrai.
  7. Versionner le script avec Git (cours Git et GitHub), puis le planifier si la tâche est récurrente (chapitre 14).

Exercices

Exercice 1 sur 3 PowerShell ou Bash ? Réussi À revoir

Pour chaque tâche de Sorbier Logistique, dis quel langage tu choisis et pourquoi.

  1. Désactiver les comptes Active Directory des saisonniers partis.
  2. Archiver chaque nuit la configuration nginx de srv-web.
  3. Relever l'espace libre du disque C: de srv-ad, srv-ad2 et srv-fichiers.
  4. Compter les tentatives de connexion SSH échouées sur srv-web la nuit dernière.
  5. Interroger l'API de supervision Zabbix depuis un poste Windows pour lister les hôtes en panne.
Voir la réponseMasquer la réponse de l'exercice 1
  1. PowerShell, avec le module ActiveDirectory : il manipule directement les objets de l'annuaire.
  2. Bash : srv-web est un serveur Debian, tar et cron y sont déjà.
  3. PowerShell, avec Invoke-Command sur les trois serveurs Windows (chapitre 11).
  4. Bash, avec journalctl et grep sur le serveur lui-même.
  5. PowerShell, avec Invoke-RestMethod : la réponse JSON devient des objets sans autre outil. Bash avec curl et jq conviendrait aussi depuis un poste Linux : quand la cible est une API, le choix dépend surtout de la machine d'où tu lances le script.

Tu avais trouvé ?

Exercice 2 sur 3 Le script qui ne démarre pas Réussi À revoir

Moussa Diallo a écrit verif.sh sur son poste Windows, l'a copié sur srv-web et tape successivement :

text
mdiallo@srv-web:~$ verif.sh
-bash: verif.sh : commande introuvable
mdiallo@srv-web:~$ ./verif.sh
-bash: ./verif.sh: Permission non accordée

Après avoir corrigé ce deuxième problème, il obtient :

text
/usr/bin/env: « bash\r »: Aucun fichier ou dossier de ce nom

Explique chacun des trois messages et donne la commande qui corrige chaque problème.

Voir la réponseMasquer la réponse de l'exercice 2
  1. Commande introuvable : sans chemin, Bash ne cherche le programme que dans les dossiers du PATH, et le dossier courant n'en fait pas partie. Il faut taper ./verif.sh.
  2. Permission non accordée : le fichier n'a pas le droit d'exécution. chmod +x verif.sh (ou chmod u+x pour le seul propriétaire).
  3. bash\r introuvable : le fichier a des fins de ligne Windows (CRLF). Le shebang se termine par un \r invisible, et l'interpréteur cherché s'appelle « bash suivi d'un retour chariot ». Correction : sed -i 's/\r$//' verif.sh (ou dos2unix verif.sh si le paquet est installé), puis régler VS Code sur LF pour les fichiers .sh.

Tu avais trouvé ?

Exercice 3 sur 3 Lire un shebang Réussi À revoir

Quel interpréteur lit chacun de ces scripts quand on le lance avec ./script sur Debian 13 ? Lequel risque de mal fonctionner s'il utilise [[ ]] ?

  1. #!/bin/bash
  2. #!/bin/sh
  3. #!/usr/bin/env pwsh
  4. Aucune première ligne commençant par #!
Voir la réponseMasquer la réponse de l'exercice 3
  1. Bash, par son chemin absolu.
  2. /bin/sh, qui est dash sur Debian. C'est celui-là qui échoue sur [[ ]], une extension de Bash : dash affiche une erreur du type [[: not found.
  3. PowerShell 7 (pwsh), cherché dans le PATH : un script PowerShell peut s'exécuter comme un script Linux s'il est installé.
  4. Le shell depuis lequel on le lance (Bash dans un terminal Debian) : le résultat dépend de qui lance le script, par exemple cron qui utilise /bin/sh. Il faut toujours écrire un shebang.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : PowerShell 7 et Windows PowerShell 5.1 : versions et différencesRevoir le sommaire du cours