Variables

Mise à jour : Debian 9.8

Les variables sont des paramètres (chaînes de caractère), manipulables par le shell.

1 - Création

1.1 - Principe

$ var=exemple
$ 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

1.2 - Expression des valeurs

La valeur peut-être définie par :

$ var1=une-chaîne-de-caractères         
$ echo $var1
une-chaîne-de-caractères
$ var2="une chaîne de caractères"
echo $var2
une chaîne de caractères
$ var3="$var1 $var2"
$ echo $var3
une-chaîne-de-caractères une chaîne de caractères
$ 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
$ var5=$((2**3))
$ echo $var5
8
$ 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
$ 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

1.3 - Liste des variables

$ (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
$ compgen -v
BASH
BASHOPTS
BASHPID
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_COMMAND
........

1.4 - Suppression

Pour supprimer une variable et vérifier sa suppression :

$ unset var_test
$ (set -o posix; set)|grep var_test

2 - Variables permanentes

Par défaut, les variables créées pendant une session sont temporaires et disparaissent avec la fermeture du shell. Il est possible de rendre une variable permanente en l'ajoutant à un des fichiers de démarrage du shell, ainsi elle sera disponible à chaque ouverture d'un nouveau shell.

$ 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

3 - Variables d'environnement

$ var2="exemple de création d'une variable d'environnement"
$ export var2
$ export var1="exemple de création d'une variable d'environnement en un temps"
$ printenv
.....
$ printenv LANG
fr_FR.utf8
$ 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
.........

4 - Variables système

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
...
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
$ 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.

5 - Modification des variables système par l'utilisateur

Certaines variables système sont modifiables par l'utilisateur, par exemple PATH, LANG, PS1, ...

5.1 - PATH

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
export PATH=$PATH:$HOME/script

5.2 - Modification de la langue

$ echo $LANG
fr_FR.utf8
$ date
jeudi 3 août 2017, 16:08:36 (UTC+0200)
$ LANG=en_US date
Thu Aug 10 04:03:48 CEST 2017
$ LANG='en_US.utf8'
$ date
Thu Aug 3 16:00:43 CEST 2017
$ echo "LANG='eng_US.utf8'" >>~/.bashrc