Mise à jour : Debian 9.8
Les variables sont des paramètres (chaînes de caractère), manipulables par le shell.
La création d'une variable s'effectue par une déclaration du type : variable=valeur
$ var=exemple
Les noms des variables ne doivent contenir que des lettres, des chiffres et le tiret du bas (_). Le premier caractère doit être une lettre ou le tiret du bas.
Le contenu de la valeur est accessible en utilisant ${var} ou $var simplement s'il n'y a pas d’ambiguïté :
$ echo $var
exemple
$ echo ${#var}
7
$ echo $var |hexdump -C
00000000 65 78 65 6d 70 6c 65 0a |exemple.|
00000008
$ echo -n $var |hexdump -C
00000000 65 78 65 6d 70 6c 65 |exemple|
00000007
La valeur peut-être définie par :
une chaîne de caractères sans espace
$ var1=une-chaîne-de-caractères
$ echo $var1
une-chaîne-de-caractères
une chaîne de caractères avec espace
$ var2="une chaîne de caractères"
echo $var2
une chaîne de caractères
des arguments expansés
$ var3="$var1 $var2"
$ echo $var3
une-chaîne-de-caractères une chaîne de caractères
des résultats de commande
$ var4=$(ip route)
echo $var4
default via 192.168.0.254 dev wlan0 192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.12
des expansions de calculs arithmétiques
$ var5=$((2**3))
$ echo $var5
8
des concaténations de variables et de chaînes de caractères
$ var6=conca
$ var7=tenation
$ var8=DEBUT$var6${var7}FIN # les accolades sont nécessaires autour de var7 afin qu'elle soit identifiée
$ echo $var8
DEBUTconcatenationFIN
des combinaisons des différents types de définition ci-dessus
$ var5="$var1 $(ip route) $((2**3))"
echo $var5
une-chaîne-de-caractères default via 192.168.0.254 dev wlan0 192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.12 8
$ (set -o posix; set)
BASH=/bin/bash
BASHOPTS=cdspell:checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
.........
Elle permet de tester la présence d'une variable :
$ (set -o posix; set)|grep var_test
var_test=azerazerazer
La liste de toutes les variables est également fournie par compgen -v (quelques écarts avec la liste fournie par set ...)
$ compgen -v
BASH
BASHOPTS
BASHPID
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_COMMAND
........
Note : compgen -v xyz fournit la liste des variables commençant par xyz
Pour supprimer une variable et vérifier sa suppression :
$ unset var_test
$ (set -o posix; set)|grep var_test
Exemple : création de la variable permanente mon_ip :
$ echo 'monip=$(dig +short myip.opendns.com @resolver1.opendns.com)'>>~/.bashrc
Relancer la session ou "sourcer" le fichier .bashrc pour rendre la variable disponible :
$ source ~/.bashrc
$ echo $monip
82.67.140.211
Par défaut, les variables ne sont pas "héritées" dans les shells fils, elles sont appelées variables de shell. La commande export permet de rendre une variable héritable dans tous les shells fils., elle est alors appelée variable d'environnement.
$ var2="exemple de création d'une variable d'environnement"
$ export var2
Il est également possible de définir une variable d'environnement lors de sa création :
$ export var1="exemple de création d'une variable d'environnement en un temps"
La liste des variables d'environnement ( = variables exportées) est donnée par printenv. Elle comprend les variables provisoires et permanentes, donc y compris les variables initialisées par le shell, avec leur valeur :
$ printenv
.....
printenv peut également être utilisé pour afficher la valeur d'une variable d'environnement
$ printenv LANG
fr_FR.utf8
La liste des variables d'environnement sans leur valeur est donnée par compgen -e
$ compgen -e
COLORTERM
CUR_WIDTH
DBUS_SESSION_BUS_ADDRESS
DESKTOP_SESSION
DISPLAY
GCC_COLORS
GDMSESSION
GIO_LAUNCHED_DESKTOP_FILE
GIO_LAUNCHED_DESKTOP_FILE_PID
GLADE_CATALOG_PATH
.........
Note : compgen -e xyz fournit la liste des variables d'environnement commençant par xyz
La commande set (avec l'option posix) affiche la liste des variables avec leur valeur :
$ (set -o posix; set)
....
XDG_CURRENT_DESKTOP=XFCE
XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share/:/usr/share/:/usr/share
XDG_GREETER_DATA_DIR=/var/lib/lightdm/data/philippe
XDG_MENU_PREFIX=xfce-
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
...
Quelques variables usuelles :
SHELL : nom du shell
HOME : nom du répertoire de l'utilisateur
PWD : nom du répertoire de travail courant
OLD_PWD : nom du répertoire de travail précédent
USER : nom de login de l'utilisateur
PATH : liste de répertoires dans lesquels le shell cherche les commandes
LANG : langue de saisie et d'affichage
PS1 : définition du prompt
La valeur de ces variables peut être affichée comme toute variable :
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
4.4.12(1)-release
Dans l'exemple, le programme de shell est bash version 4.4.12.
Certaines variables système sont modifiables par l'utilisateur, par exemple PATH, LANG, PS1, ...
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
export PATH=$PATH:$HOME/script
La langue actuelle du shell est le français :
$ echo $LANG
fr_FR.utf8
$ date
jeudi 3 août 2017, 16:08:36 (UTC+0200)
Pour utiliser l'anglais
pour la commande en cours
$ LANG=en_US date
Thu Aug 10 04:03:48 CEST 2017
dans le shell courant
$ LANG='en_US.utf8'
$ date
Thu Aug 3 16:00:43 CEST 2017
$ echo "LANG='eng_US.utf8'" >>~/.bashrc