Variables BASH

Sommaire

Index

Webographie

Shell Command Language

Bases

Définition d’une variable

nom=valeur

Affichage/utilisation d’une variable

Ces deux syntaxes fonctionnent:

echo ${nom}
echo $nom

Expansion de variables (ou paramètres)

Le fait d’afficher une variable s’appuie sur un mécanisme du Shell nommé l’expansion de variable.

L’expansion a lieu:

Voir le paragraphe EXPANSION du manuel Bash

Guillemets

echo "$valeur" # Toujours utiliser les guillemets quand on utilise une variable

Guillemets simples (single quote)

Les single quotes (ou apostrophes) empêchent l’expansion de variable:

$ echo '$valeur'
$valeur

Variable multiligne

valeur="Je
suis
ici"

Chaînes de caractères

Définition

Sans espace

valeur="chaine"
valeur='chaine'

À éviter:

valeur=chaine

Avec des espaces

valeur="chaine avec espace"
valeur='chaine avec espace'

Longueur

$ echo ${#valeur}
18

Expansion

Bonne pratique

$ echo "${valeur}s"
regardez bien cecis

Non recommandé

$ valeur="regardez bien ceci"
$ echo "$valeur"
regardez bien ceci
Si on colle des caractères

Ceci fonctionne aussi (on ajoute par exemple un point . juste après le nom):

$ echo "$valeur."
regardez bien ceci.
Le piège: prolonger l’identifiant de la variable

Si on remplace le point par un s:

$ echo "$valeurs"

La variable valeurs est différente de la variable valeur: ici elle est vide

Manipulation de chaînes

découpage de chaîne

$ valeur="regardez bien ceci"
$ echo ${valeur:0:8}
regardez
$ valeur="regardez bien ceci"
$ echo ${valeur:9:4}
bien
$ valeur="regardez bien ceci"
$ echo "${valeur:8}"
 bien ceci
$ valeur="regardez bien ceci"
$ echo "${valeur::8}"
regardez

Récupération des trois dernières lettres

$ echo "${valeur: -3:3}."
eci.

L’espace est indispensable: ce qui suit ne permettra pas de récupérer les trois dernières lettres

$ echo "${valeur:-3:3}."
regardez bien ceci.

Modification de chaîne

Tronquer le suffixe

$ valeur="regardez bien ceci"
$ echo "${valeur% ceci}."
regardez bien.

Tronquer le préfixe

$ valeur="regardez bien ceci"
$ echo "${valeur#regardez }."
bien ceci.

Suppression augmentée

Suppression à partir du dernier élément correspondant
$ valeur="regardez bien ceci"
$ echo "${valeur%e*}."
regardez bien c.
Suppression à partir du premier élément correspondant
$ valeur="regardez bien ceci"
$ echo "${valeur%%e*}."
r.
$ valeur="regardez bien ceci"
$ echo "${valeur%% ceci}."
regardez bien.
Application sur les noms de fichiers
$ cible=test.txt
$ echo "${cible%.txt}"
test
$ echo "${cible%%.txt}"
test
$ echo "${cible##test.}"
txt
$ echo "${cible##*.}"
txt

Changement de casse

Mise en majuscule

$ valeur="regardez bien ceci"
$ echo ${valeur^}
Regardez bien ceci
$ echo ${valeur^^}
REGARDEZ BIEN CECI
$ echo ${valeur^^e}
rEgardEz biEn cEci
$ echo ${valeur^e}
regardez bien ceci

Mise en minuscule

$ majuscule="REGARDEZ VRAIMENT ICI"
$ echo ${majuscule,,}
regardez vraiment ici
$ echo ${majuscule,}
rEGARDEZ VRAIMENT ICI

Changement de casse

$ MIX="CECI est IMPortant"
$ echo ${MIX~~}
ceci EST impORTANT

Application sur des noms de fichiers

$ ls *
aa.txt ab.txt ac.txt ba.txt bb.txt bc.txt

$ fichiers=(*)
$ echo "${fichiers[@]}"
Aa.txt Ab.txt Ac.txt Ba.txt Bb.txt Bc.txt
$ echo "${fichiers[@]^}"
Aa.txt Ab.txt Ac.txt Ba.txt Bb.txt Bc.txt
$ echo "${fichiers[@]^^}"
AA.TXT AB.TXT AC.TXT BA.TXT BB.TXT BC.TXT
$ echo "${fichiers[@]~~}"
aA.TXT aB.TXT aC.TXT bA.TXT bB.TXT bC.TXT
$ echo "${fichiers[@],,}"
aa.txt ab.txt ac.txt ba.txt bb.txt bc.txt

Exercice 1: conversion avec pandoc

Écrire un programme nommé convertir_html qui:

  1. demande à l’utilisateur de saisir un nom de fichier en .md
  2. vérifie que le fichier existe
  3. s’il existe, exécute la commande pandoc permettant de générer un fichier html à partir de ce fichier avec le suffixe html

Edition façon sed

$ valeur="las, ceci est cela"    
$ echo "${valeur/la/Hela}"
Helas, ceci est cela                       
$ echo "${valeur/#la/Hela}" # Debut de chaine
Helas, ceci est cela
$ echo "${valeur/%la/Hela}" # Fin de chaine
las, ceci est ceHela
$ echo "${fichiers[@]/%txt/md}"
a.md b.md c.md
$ echo "${fichiers[@]/txt/md}"
a.md b.md c.md
$