Sommaire

Voici quelques exemples de manipulations des variables en Bash

Affectation d’une variable

Il n’y a aucun espace entre le nom de la variable et le “=”. Une variable non initialisée est vide.


a="Hello World"
echo $a
Hello World

b=$a

c=$(ls /sys)
echo $c
block bus class dev devices firmware fs hypervisor kernel module power

c=$(ls /failed 2>&1)
echo $c
ls: cannot access /failed: No such file or directory

b=$(cat <<END
ceci est une chaine
sur plusieurs lignes
END
)
echo -e "$b"
ceci est une chaine
sur plusieurs lignes

b="aussi sur plusieurs
lignes"
echo -e "$b"
aussi sur plusieurs
lignes


Utilisation de la variable

Il est important lorsque l’on utilise les variables de bien utiliser les doubles quotes. Lorsqu’une variable se trouve entre simple quote elle n’est pas interprétée.


### Initialisation ###
a="hello World"
b=$a

### fonction qui imprime le nom de paramètres reçus ###
func()
{
    echo "Nb param = "$#
}

##########################################

echo $b
hello World

##########################################

func $b
Nb param = 2
func "$b"
Nb param = 1
b=""
func $b
Nb param = 0
func "$b"
Nb param = 1


##########################################

echo "$a"
hello World
echo '$a'
$a

##########################################

echo -${a}coucou-
-hello Worldcoucou-
echo -$acoucou-
--
echo $a"coucou"
hello Worldcoucou
echo "$a""coucou"
hello Worldcoucou
echo "$a"coucou
hello Worldcoucou

taille d’une chaîne


str="1234567890"

echo ${#str}
10

substring

${str:0:5}

la première valeur correspond à l’offset dans la chaîne et le second à la taille de la sous-chaîne.


str="1234567890"
echo ${str:0:5}
12345
echo ${str:2:-2}
345678

substitution

# => le matching le plus court
## => le matching le plus long possible

Suppression en début de chaîne


file="/var/run/myfile.txt"
echo ${file#*/}
var/run/myfile.txt
echo ${file##*/}
myfile.txt

Supression en fin de chaîne

% => le matching le plus court
%% => le matching le plus long possible


file="my.file.txt"
echo ${file%.txt}
my.file
echo ${file%.*}
my.file
echo ${file%%.*}
my

Substitution d’une chaîne par une autre

/ => le matching le plus court
// => le matching le plus long possible


file="my.my.file.txt"
echo ${file/my/your}
your.my.file.txt
echo ${file//my/your}
your.your.file.txt

Astuce : renommer des fichiers ayant une extension vers une autre

touch a.txt b.txt c.txt d.txt
ls
a.txt  b.txt  c.txt  d.txt
for i in *.txt
do
mv -v $i ${i%.txt}.xml
done
‘a.txt’ -> ‘a.xml’
‘b.txt’ -> ‘b.xml’
‘c.txt’ -> ‘c.xml’
‘d.txt’ -> ‘d.xml’
ls
a.xml  b.xml  c.xml  d.xml

portée d’une variable

Portée d’une variable dans un process fils


cat test.sh
#!/bin/bash
echo "-$var-"

var='Suis-je visible ?'
./test.sh
--

export var
./test.sh
-Suis-je visible ?-

portée d’une variable dans une fonction


func()
{
  local a="je suis a dans func"
  echo "-$b-/-$a-"
}


a="je suis a"
b="je suis b"

echo "$a"
je suis a
echo "$b"
je suis b

func
-je suis b-/-je suis a dans func-

echo "$a"
je suis a
echo "$b"
je suis b