Outils pour utilisateurs

Outils du site


technique:linux:shells:bash_variables

Variables shell

Voir une liste de variables d'environnement (shell, etc)


env

Voir une variable particulière


exemple : echo $SHELL

Supprimer une variable


unset toto (et non pas $toto !)

Conversions minuscules/majsucules


$ a=azerty $ echo $a |tr a-z A-Z AZERTY

Substitution de variables


http://www.linuxplusvalue.be/mylpv.php?id=187 http://abs.traduc.org/abs-3.4-fr/string-manipulation.html

Affectation


$ TUTU=“Le soleil brille” $ echo $TUTU Le soleil brille

Valeur par défaut à utiliser en cas de variable inexistante


NB : TITI est une variable inexistante $echo TITI

$ echo ${TITI:-il pleut} il pleut $ echo ${TUTU:-il pleut} Le soleil brille $echo TITI

ce qui montre que la valeur de TITI est temporaire

Affectation d'une valeur en cas de variable inexistante


$ echo ${TITI:=coucou} coucou $ echo TITI coucou

Message à renvoyer en cas de variable inexistante


$ unset TITI $ echo ${TUTU:?Cette variable est vide} Le soleil brille $ echo ${TITI:?Cette variable est vide} bash: TITI: Cette variable est vide

Message à renvoyer si la variable existe


$ echo ${TUTU:+Cette variable est initialisée} Cette variable est initialisée $ echo ${TITI:+Cette variable est initialisée}

Dans un bash utiliser plutôt un code, par exemple 0 pour TRUE $ echo ${TUTU:+0} 0

Extraction d'une sous-chaîne


${variable:position:longueur}

$ echo $TUTU Le soleil brille $ echo ${TUTU:3:6} soleil $ echo ${TUTU:3} soleil brille

La numérotation commence à 0 La longueur de la chaîne soleil est 6 caractères

Extraire un/des nombre(s)


$ a=azer ti128bb $ echo ${a[^0-9]} #Supprime tout ce qui n'est pas un chiffre 128 $ b=“azer ti128bb85ezaz032e” $ echo ${a[^0-9]} 12885032

⇒ Extraire plusieurs nombres : $ echo “$b” | sed -e 's/[^0-9]/ /g'

     128  85    032

$ for n in $(echo $b | sed -e 's/[^0-9]/ /g'); do echo $n; done 128 85 032

Ou mieux : $ echo ${b[^0-9]/ } 128 85 032 $ for n in $(echo ${b[^0-9]/ }); do echo $n; done 128 85 032

Nombre de caractères dans la variable :


$ echo ${#TUTU} 16 $ LEN=${#TUTU} $ echo $LEN 16

Suppressions


$ echo ${TUTU/soleil} Le brille

$ echo ${TUTU/le} Le soil brille # une seule suppression (1° occurence de “le”

$ echo ${TUTUle} # plusieurs suppressions (“le” supprimé partout) Le soil bril Suppressions à partir du _début de la chaîne_ : TITI=“Le soleil brille et le vent souffle” $ echo ${TITI#Le} soleil brille et le vent souffle $ echo ${TITI#brille} Le soleil brille et le vent souffle ⇒ Attention avec # et ## les suppressions commencent à partir du début de la chaîne !! $ echo ${TITI#Le*brille} et le vent souffle ou plus simplement : $ echo ${TITI#*brille} et le vent souffle Mais : $ echo ${TITI#soleil*souffle} Le soleil brille et le vent souffle # ne marche pas $ echo ${TITI#*il} # Suppression entre le début de la chaîne et le _premier_ “il” brille et le vent souffle $ echo ${TITI##*il} # Suppression entre le début de la chaîne et le _dernier_ “il” le et le vent souffle Suppressions à partir de la _fin de la chaîne_ : $ echo ${TITI%souffle} Le soleil brille et le vent Mais : $ echo ${TITI%vent} Le soleil brille et le vent souffle ⇒ Attention avec % et les suppressions commencent à partir de la fin de la chaîne !! $ echo ${TITI%brille*souffle} Le soleil $ echo ${TITI%brille*e} Le soleil $ echo ${TITI%brille*} Le soleil $ echo ${TITI%il*} Le soleil br # Suppression entre la fin de la chaîne et le il le plus proche de la fin $ echo ${TITIil*} Le sole # Suppression entre la fin de la chaîne et le il le plus loin de la fin Trouver le début et la fin d'une sous-chaîne (merci encore à Christophe Gaubert) ——————————————– $ schaine=“soleil” $ a=${TITI$schaine*} $ debut=${#a} # si on numérote à partir de 0 $ echo $debut 3 $ debut=$(( ${#a} +1 )) # si on numérote à partir de 1 $ echo $debut Ou bien, en une seule commande $ debut=$(expr length ${TITI$schaine*}) ou $ debut=$1) 1 $ echo $r 2 ⇒ l'affichage se fait avant l'incrémentation $ r=1 $ echo $2) 2 $ echo $r 2 ⇒ l'affichage se fait après l'incrémentation $ r=1 $ a=$3) $ echo $a 2 $ echo $r 2 $ r=1 a=$4) $ echo $a 2 $ echo $r 1 $ a=2 $ b=10 $ echo $5) 12 $ echo $6) 20 $ echo $7) 5 b=11 $ echo $8) 5 $ echo $9) # modulo (reste) 1 Affecter le résultat d'une commande à une variable ————————————————– $ r=`ls /usr/X11R6` # affectation $ r=$(ls /usr/X11R6) # idem $ echo $r # affichage du résultat bin/ GNUstep/ include/ lib/ man/ share/ Affichage ligne à ligne de la variable r —————————————- $ for i in $r ; do echo $i; done # ou bien echo “${r[@]}” bin/ GNUstep/ include/ lib/ man/ share/ Tester si une sous-chaîne est contenue dans une chaîne de caractères ——————————————————————– $ a=“C'est sûr, il neige aujourd'hui, il neigera demain” $ b=“neige” $ c=“soleil” $ $a == *$b* $ echo $? 0 $a == *$c* $ echo $? 1 Trouver la position de la sous-chaîne dans la chaîne —————————————————- $ echo $(expr $a : '.*est') expr: syntax error les “” sont indispensables ! $ echo $(expr “$a” : '.*est') ou bien $ echo $(expr “$a” : .*est) 5 5 est la position dans la chaîne $a du t de est Variante : $ echo $(expr match “$a” .*est) 5 Autres possibilités : $ n=$(expr “$a” : .*est) $ m=`expr “$a” : .*est` $ echo n=$n m=$m n=5 m=5 $ echo $(expr “$a” : \.\*$b) 41 ⇒ C'est le 2° neige qui est retourné :41 est la position du 2° e de neigera Trouver la position du premier “neige” $ echo $(expr index “$a” “$b”) 3 marche pas : c'est le 1° e qui est trouvé ! $ b=“rty 84bn” $ echo $(expr “$b” : .*'[0-9]') 6 Mais : $ echo $(expr $b : .*'[0-9]') expr: syntax error Comme b contient un espace, quand bash lit : $(expr $b : .*'[0-9]') il va essayer d'exécuter : $(expr rty 84bn : .*'[0-9]') Et là, erreur syntaxique : l'espace n'est pas protégé, rty et 84bn sont deux arguments, alors que expr n'en attend qu'un. Pour éviter ce genre de déconvenue, toujours mettre des guillemets. Tableaux : affectation, affichage ================================= Affecter des variables à un tableau ———————————– $ t=(bleu blanc rouge) $ echo $t bleu $ echo ${t[0]} bleu $ echo ${t[1]} blanc $ echo ${t[*]} # ou echo ${t[@]} bleu blanc rouge $ echo ${#t[*]} # Nombre d'éléments dans le tableau 3 $ t[1]=vert $ echo ${t[@]} bleu vert rouge Copie de tableau $ a=(${t[*]}) $ echo ${a[*]} bleu blanc rouge ou bien d'après certaines docs : a=“${t[@]}” $ echo ${a[*]} bleu blanc rouge blanc rouge # !!! Initialiser un tableau ———————- a=() $ echo ${#a[*]} # Nombre d'éléments dans le tableau 0 Balayer un tableau —————— for 10) ; do echo “i=$i t=${t[i]}” ; done i=0 t=bleu i=1 t=blanc i=2 t=rouge Rajouter un élément ——————- $ t=( ${t[*]} vert ) $ echo ${t[*]} bleu blanc rouge vert $ v=violet t=(${t[*]} $v) $ echo ${t[*]} bleu blanc rouge vert violet Tableau résultat d'une commande ——————————- t=(`ls /usr/X11R6`) $ echo ${t[*]} bin/ GNUstep/ include/ lib/ man/ share/ $ echo ${t[3]} lib/ Nombre de variables dans un tableau de variables ———————————————— $ echo ${#t[*]} # attentionn : echo ${#t} donne 4, soit la longueur de t[0] 6 Longueurs ——— $ echo ${#t} # ou echo ${#t[0]} 4 # nb de caractères dans le premier élément du tableau (/bin) $ echo ${#t[2]} # nb de caractères dans le 3° élément du tableau (/include) 5 Additions, soustractions ———————— t=(10 2 7) $ echo `expr ${t[0]} + ${t[2]} - ${t[1]}` 15 Adressage indirect —————— $ médor=chien $ chien=canidé $ echo $médor chien $ echo $chien canidé $ echo ${!médor} canidé

1)
`expr length ${TITI$schaine*}` + 1 )) $ fin=$(expr "$TITI" : .*$schaine) $ echo $fin # si on numérote à partir de 1 9 $ (( fin -=1 )) # Si on numérote à partir de 0 $ echo $fin 8 Autres suppressions : isoler des caractères numériques (par exemple) -------------------------------------------------------------------- $ a="abcABC de128fg hi" Enlever les caractères à gauche du nombre : $ echo $a | sed -e "s/^[a-z ]*//" # le "^" (attention : Alt GR 9 !) correspond à "début de la chaîne" 128fg hi ou bien : $ echo $a | sed -e 's/^[^0-9]*//' 128fg hi Enlever les caractères à droite du nombre : $ echo $a | sed -e 's/[^0-9]*$//' # $ indique la fin de la chaîne abc de128 Ne garder que le nombre : $ echo $a | sed -e 's/[^0-9]*//g' # g = répéter Supprimer les répétitions ------------------------- Espaces multiples: $ a="aaa bb cc" $ echo $a aaa bb cc $ echo "$a" aaa bb cc $ b=`echo $a | tr -s " "` $ echo "$b" aaa bb cc $ b=`echo $a` # Semble aussi marcher pour les espaces, à voir $ echo "$b" aaa bb cc Remplacements ------------- $ echo ${TUTU/soleil/miroir} Le miroir brille Voir également sed, ci-dessus Remplacements multiples ----------------------- $ TUTU="Le chien hurle. Le chien s'endort" $ echo ${TUTU/chien/loup} Le loup hurle. Le chien s'endort $ echo ${TUTU//chien/loup} Le loup hurle. Le loup s'endort Noter que la valeur de TUTU n'a pas changé $ echo $TUTU Le chien hurle. Le chien s'endort Suppression(s) -------------- TUTU="dix sept, dix huit, dix neuf" $ echo ${TUTU//dix} sept, huit, neuf Echo, expr et les caractères "espace" fantômes ---------------------------------------------- $ a="ab80cde" $ b=${a“80c”*} $ echo $b ab $ echo ${#b} 2 $ echo $(expr length $b) 2 Tout est OK, Maintenant : $ a=“ab 80cde” # 1 caractère “espace” entre ab et 80cde $ b=${a"80c"*} $ echo -n $b | od -a 0000000 a b # le caractère espace a disparu ! 0000002 $ echo ${#b} # Tiens on dirait qu'il y est quand même ! $ echo $(expr length $b) 2 # Ah, ben non ! $ echo $(expr length "$b") 3 # Ouf il y est ! Autre essai : $ a="ab 80cde" # 2 caractères "espace" entre ab et 80cde $ b=${a“80c”*} $ echo -n $b | od -a 0000000 a b # les 2 caractères “espace” ont disparu ! 0000002 $ echo ${#b} 4 $ echo $(expr length $b) 2 $ echo $(expr length “$b”) 4 ⇒ echo supprime les caractères espace !!! ⇒ avec expr penser toujours à entourer les variables de “” Opérations (additions, soustractions, multiplications, divisions)
$ r=1 $ echo $((r++
2)
++r
3)
r +=1
4)
r + 1
5)
$b + $a
6)
$b * $a
7) , 8)
$b / $a
9)
$b % $a
10)
i=0 ; i<${#t[*]} ; i++
technique/linux/shells/bash_variables.txt · Dernière modification : 2020/04/06 15:38 de 127.0.0.1