Sommaire
- Affectation d’une variable
- Utilisation de la variable
- taille d’une chaîne
- substring
- substitution
- portée d’une variable
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