HOWTO · Bash
Comment vérifier si une variable Bash est vide
Découvrez quatre façons en Bash de tester si une variable contient une chaîne vide, y compris les guillemets sûrs et le comportement des valeurs non définies et des valeurs composées uniquement d'espaces.
Sur cette page
Pour une valeur Bash fournie, placez son expansion entre guillemets afin que le shell la transmette comme un seul argument. Ce script affiche une valeur étiquetée :
value='Bash'
if [ -z "$value" ]; then
printf '%s\n' 'No value supplied'
else
printf 'Value: %s\n' "$value"
fi
Value: Bash
La commande test (également écrite [ ... ]) renvoie un succès lorsque la chaîne développée comporte zéro caractère. Une variable non définie se développe en une chaîne vide dans un shell Bash normal, de sorte que -z traite de la même manière les valeurs non définies et explicitement vides. Avec set -u, utilisez ${value-} pour fournir une valeur par défaut avant le test. Une valeur telle que 0 ou une chaîne d’espaces n’est pas vide ; le test vérifie les caractères, et non si un mot semble véridique.
Vérifier si une variable Bash est vide avec -z
La commande test (également écrite [ ... ]) renvoie un statut de succès lorsque la chaîne développée comporte zéro caractère. Un statut différent de zéro signifie qu’elle contient au moins un caractère. Le test lui-même n’affiche aucun message ; l’instruction if sélectionne la commande à exécuter.
value=''
if [ -z "$value" ]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is empty
Pour une variable non définie, la même vérification entre guillemets réussit dans la configuration habituelle du shell. Avec set -u, écrivez plutôt [ -z "${value-}" ] pour que l’expansion reste définie. La commande entre crochets est une commande du shell dont le succès ou l’échec est représenté par son statut de sortie ; elle n’affiche pas true ou false automatiquement.
Vérifier si une variable Bash n’est pas vide avec -n
Utilisez -n pour le test complémentaire : il renvoie un succès lorsque la chaîne développée comporte au moins un caractère. La branche then s’exécute pour une valeur non vide, et else s’exécute lorsque le test échoue, y compris lorsque la valeur est vide.
value='Bash'
if [ -n "$value" ]; then
printf '%s\n' 'value is not empty'
else
printf '%s\n' 'value is empty'
fi
value is not empty
Les guillemets sont importants car ils conservent l’expansion comme un seul argument. Comme avec -z, utilisez ${value-} à l’intérieur des guillemets si le script peut s’exécuter avec set -u et si la variable peut être non définie. L’option -n est particulièrement lisible lorsque l’action suivante ne doit avoir lieu qu’après qu’une valeur a été fournie.
Comparer une variable Bash à une chaîne vide
Vous pouvez comparer directement une valeur à une chaîne vide à l’aide de l’expression conditionnelle [[ ... ]] de Bash. L’expansion entre guillemets rend l’intention claire, et une chaîne contenant des espaces reste non vide car ces espaces sont des caractères.
value=' '
if [[ "$value" == "" ]]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is not empty
Cet exemple emprunte la deuxième branche : les espaces ne disparaissent pas à l’intérieur de [[ ... ]]. Pour les scripts qui utilisent set -u, comparez ${value-} afin qu’une variable non définie soit traitée comme une chaîne vide.
Vérifier une variable avec l’expansion de paramètre ${parameter:+word}
La forme ${parameter:+word} se développe en word lorsque le paramètre est défini et non nul. Elle ne se développe en rien lorsque le paramètre n’est pas défini ou contient une chaîne vide. Testez l’expansion tout en la plaçant entre guillemets :
value='Bash'
if [ "${value:+present}" ]; then
printf '%s\n' 'value is set and nonempty'
else
printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty
Cet idiome est utile lorsque la distinction dont vous avez besoin est « défini et non vide » par opposition à « non défini ou vide ». Il ne distingue pas ces deux derniers états. Pour distinguer un paramètre non défini d’un paramètre défini mais vide, utilisez la vérification [[ -v value ]] de Bash comme test distinct.