Skip to content

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:

declare -ir my_int=40

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 :

username=''

echo ${username:-$(whoami)}
# current_user

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 :

var_1="var_2"
var_2="var_3"

echo ${var_1}
# var_2

echo ${!var_1}
# var_3

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 :

my_var="HeLLo"

echo ${my_var^^}
# HELLO

echo ${my_var,,}
# hello

Il est aussi possible de passer uniquement la première lettre en majuscule ou en minuscule avec la syntaxe ${var^} et ${var,} :

my_var="hello"

echo ${my_var^}
# Hello

my_var="HELLO"

echo ${my_var,}
# hELLO

Ou encore de choisir les lettres à transformer avec une pattern :

my_var="hello"

echo ${my_var^^[ho]}
# HellO

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 :

my_var="one"

echo ${#my_var}
# 3

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 :

echo "$a / $b" | bc       # 2
echo "$a / $b" | bc -l    # 2.66666666666666666666

Fonction let

a=8
b=4

let "c = a + b"
let "d = a ** b"

echo "\$c : $c"   # $c : 12
echo "\$d : $d"   # $d : 4096

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 :

my_var='Hello Manola !'

echo "'${my_var##H*o}'"
# 'la !'

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.

my_var='Hello Manola !'

echo "'${my_var%o*\!}'"
# 'Hello Man'

echo "'${my_var%%o*\!}'"
# 'Hell'

Voici un exemple d'utilisation permettant de séparer le répertoire et le nom d'un fichier :

my_file="/to/path/file.txt"

echo ${my_file%/*}
# /to/path

echo ${my_file##*/}
# file.txt

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 / :

my_var='Hello Manola !'

echo "'${my_var//o/X}'"
# 'HellX ManXla !'

Il est aussi possible de remplacer la sous chaîne par une valeur NULL :

my_var='Hello Manola !'

echo "'${my_var/H*M/}'"
# 'anola !'

echo "'${my_var//l/}'"
# 'Heo Manoa !'

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 '$_ : '$_
# ./script.sh
Script Pid              $$ : 10962
sleep .1                $? : 0
sleep -bad_argument     $? : 1
sleep .1 &              $! : 11025
echo Hello > /dev/null  $_ : Hello
Back to top