Bash - Variables
Manipulation
Déclaration
La commande declare permet de déclarer (et d'afficher) des variables avec un type. Voici les différentes options de la commande :
| Option | Fonction |
|---|---|
-r |
Lecture seule |
-i |
Entier |
-a |
Tableau (array) |
-f |
Fonction(s) |
-x |
Export |
Examples:
Déclaration d'une variable de type entier en lecture seule:
Valeur par défaut
Il est possible de donner une valeur à une variable si celle ci n'est pas défini ou est égal à NULL. Pour la prise en compte des variables déclarées mais NULL il sera nécessaire de rajouter un caractère (:).
La syntaxe ${var-value} affichera la valeur sans l'attribuer à la variable :
my_var=''
echo ${my_var-Default}
# {NULL}
echo ${my_var:-Default}
# Default
echo ${my_var}
# {NULL}
unset my_var
echo ${my_var-Default}
# Default
my_var='Value'
echo ${my_var:-Default}
# Value
La syntaxe ${var=value} affichera la valeur et l'assignera à la variable :
my_var=''
echo ${my_var=Default}
# {NULL}
echo ${my_var:=Default}
# Default
echo ${my_var}
# Default
unset my_var
my_var='Value'
echo ${my_var:=Default}
# Value
Cela fonctionne aussi avec une commande, par exemple :
Expansion Indirecte
Si le premier caractère du paramètre est un point d'exclamation (!), Un niveau d'indirection de variable est introduit.
Bash utilise la valeur de la variable formée à partir du reste du paramètre comme nom de la variable :
Interprétation
Il est possible d'interpréter des variables dans un fichier texte avec la commande envsubst :
MY_USER=Loko
echo 'Hello $MY_USER' > user.txt
cat user.txt
# Hello $MY_USER
envsubst < user.txt
# Hello Loko
Majuscule/Minuscule
Les 2 syntaxes ${var^^} et ${var,,} permettent respectivement de passer une variable en majuscule ou en minuscule :
Il est aussi possible de passer uniquement la première lettre en majuscule ou en minuscule avec la syntaxe ${var^} et ${var,} :
Ou encore de choisir les lettres à transformer avec une pattern :
Arithmetique
Taille d'une chaîne
Pour déterminer la longueur d'une chaîne de caractère il suffit de rajouter # avant le nom de la variable :
Opération
Il y a plusieurs méthodes permettant de faire des calculs en bash.
Syntaxe spéciale
a=8
b=2
echo $((a + b)) # Addition
echo $((a - b)) # Substraction
echo $((a * b)) # Multiplication
echo $((a / b)) # Division
echo $((a % b)) # Modulo
echo $((a ** b)) # Puissance
Fonction expr
expr $a + $b # Addition
expr $a - $b # Substraction
expr $a \* $b # Multiplication
expr $a / $b # Division
expr $a % $b # Modulo
Fonction bc
echo "$a + $b" | bc # Addition
echo "$a - $b" | bc # Substraction
echo "$a * $b" | bc # Multiplication
echo "$a / $b" | bc # Division
echo "$a % $b" | bc # Modulo
La fonction bc permet aussi d'afficher les décimales avec l'option -l :
Fonction let
Sous chaîne
Fractionner
Pour fractionner une chaîne de caractère il faut utiliser la syntaxe suivante : ${var:<position>:<length>}
my_var='abcdefghifklmnop'
echo "'${my_var:6}'"
# 'ghifklmnop'
echo "'${my_var:1:4}'"
# 'bcde'
echo "'${my_var:6:10}'"
# 'ghifklmnop'
echo "'${my_var::3}'"
# 'abc'
echo "'${my_var:(-3)}'"
# 'nop'
Supprimer
Depuis le début
La syntaxe ${var#<pattern>} permet de supprimer une sous chaîne de caractère en commençant par le début :
my_var='Hello Manola !'
echo "'${my_var#H*[ol]}'"
# 'lo Manola !'
echo "'${my_var#H* }'"
# 'Manola !'
L'on peut ajouter un # pour supprimer la sous chaîne la plus longue :
Depuis la fin
La syntaxe ${var%<pattern>} permet de supprimer une sous chaîne de caractère en commençant par la fin. L'on peut aussi ajouter un % pour supprimer la sous chaîne la plus longue.
Voici un exemple d'utilisation permettant de séparer le répertoire et le nom d'un fichier :
Remplacer
La syntaxe ${var/<pattern>/<new pattern>} permet de remplacer une sous chaîne de caractère.
my_var='Hello Manola !'
echo "'${my_var/o/X}'"
# 'HellX Manola !'
echo "'${my_var/Hello/GoodBye}'"
# 'GoodBye Manola !'
La syntaxe précédente remplace uniquement la première occurrence. Pour que toutes les occurrences soit remplacées il suffit de doubler le / :
Il est aussi possible de remplacer la sous chaîne par une valeur NULL :
Variables Spéciales
Arguments
Voici la liste de variables permettant de gérer les arguments :
| Variable | Fonction |
|---|---|
$0 |
Nom du script |
$1, $2, $3, $*n* |
Argument(s) |
$* |
Liste des arguments sur une ligne (ex: "a b c") |
$@ |
Liste des arguments dans un tableau (ex : "a" "b" "c") |
$# |
Nombre d'arguments |
Examples
Voici un petit script affichant les informations sur les arguments:
#!/bin/bash
echo '[$0] Script Name : '$0
echo '[$1] First Argument : '$1
echo '[$2] Second Argument : '$2
echo '[$*] Arguments List : '$*
echo '[$@] Arguments List : '$@
echo '[$#] Arguments Count : '$#
# ./script.sh a b
[$0] Script Name : ./script.sh
[$1] First Argument : a
[$2] Second Argument : b
[$*] Arguments List : a b
[$@] Arguments List : a b
[$#] Arguments Count : 2
Autres
| Variable | Fonction |
|---|---|
$$ |
Pid du shell courant |
$? |
Code retour de la dernière commande |
$! |
Id du processus de la dernière tâche exécutée en BG |
$_ |
Retour de la dernière commande |
Exemples
#!/bin/bash
printf "%-24s" 'Script Pid'
echo '$$ : '$$
printf "%-24s" "sleep .1"
sleep .1; cmd_return=$?
echo '$? : '$cmd_return
printf "%-24s" "sleep -bad_argument"
sleep -bad_argument 2>&-; cmd_return=$?
echo '$? : '$cmd_return
printf "%-24s" "sleep .1 &"
sleep .1 &
echo '$! : '$!
printf "%-24s" "echo Hello > /dev/null"
echo Hello > /dev/null
echo '$_ : '$_