Quelle est la meilleure façon de déterminer si une variable en bash est vide ("")?
J'ai entendu dire qu'il est recommandé de faire if [ "x$variable" = "x" ]
Est-ce la bonne méthode? (il doit y avoir quelque chose de plus direct)
Quelle est la meilleure façon de déterminer si une variable en bash est vide ("")?
J'ai entendu dire qu'il est recommandé de faire if [ "x$variable" = "x" ]
Est-ce la bonne méthode? (il doit y avoir quelque chose de plus direct)
Une alternative que j'ai vue à [ -z "$foo" ]
est la suivante, cependant je ne suis pas sûr pourquoi les gens utilisent cette méthode, quelqu'un sait?
[ "x${foo}" = "x" ]
De toute façon, si vous interdisez les variables non définies (soit par set -u
ou set -o nounset
), alors vous rencontrerez des problèmes avec ces deux méthodes. Il y a une solution simple à cela:
[ -z "${foo:-}" ]
Remarque: cela laissera votre variable non définie.
Il y a un commentaire sur l'alternative à -z
à l'adresse pubs.opengroup.org/onlinepubs/009695399/utilities/test.html. Fondamentalement, ce n'est pas censé être une alternative à -z
. Au contraire, cela gère les cas où $foo
pourrait se développer en quelque chose commençant par un métacaractère que [
ou test
serait confus par. Mettre un non-métacaractère arbitraire au début élimine cette possibilité.
La question demande comment vérifier si une variable est une chaîne vide et les meilleures réponses sont déjà données pour cela.
Mais je suis arrivé ici après une longue période de programmation en php et ce que je cherchais en réalité était une vérification comme la fonction empty en php qui fonctionne dans un shell bash.
Après avoir lu les réponses, j'ai réalisé que je ne pensais pas correctement en bash, mais de toute façon, à ce moment-là, une fonction comme empty en php aurait été tellement pratique dans mon code bash.
Comme je pense que cela peut arriver à d'autres, j'ai décidé de convertir la fonction empty php en bash
Selon le manuel de php:
une variable est considérée comme vide si elle n'existe pas ou si sa valeur est l'une des suivantes:
Évidemment les cas null et false ne peuvent pas être convertis en bash, donc ils sont omis.
function empty
{
local var="$1"
# Renvoie vrai si :
# 1. var est une chaîne nulle ("" comme chaîne vide)
# 2. une variable non définie est passée
# 3. une variable ou un tableau déclaré mais sans valeur est passé
# 4. un tableau vide est passé
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Renvoie vrai si var est zéro (0 en tant qu'entier ou "0" en tant que chaîne)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Renvoie vrai si var est 0.0 (0 en tant que flottant)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Exemple d'utilisation:
if empty "${var}"
then
echo "vide"
else
echo "non vide"
fi
Démo :
le snippet suivant:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"chaîne"
" "
)
for (( i=0; i<${#vars[@]}; i++ ))
do
var="${vars[$i]}"
if empty "${var}"
then
what="vide"
else
what="non vide"
fi
echo "VAR \"$var\" est $what"
done
exit
donne en sortie :
VAR "" est vide
VAR "0" est vide
VAR "0.0" est vide
VAR "0" est vide
VAR "1" n'est pas vide
VAR "chaîne" n'est pas vide
VAR " " n'est pas vide
Cela dit, dans une logique bash, les vérifications sur zéro dans cette fonction peuvent causer des problèmes secondaires à mon avis, toute personne utilisant cette fonction devrait évaluer ce risque et peut-être décider de supprimer ces vérifications pour ne laisser que la première.
La question portait sur bash. Je suis en train d'utiliser bash. Ça marche bien pour moi. De quoi exactement parles-tu ?
Si vous utilisez Bash, vous devriez utiliser des doubles crochets. Mon commentaire précédent était une simple déclaration de fait pour ceux qui pourraient lire votre réponse et utiliser un shell différent.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.
1 votes
Voir : Test pour une chaîne de caractères de longueur non nulle en Bash sur StackOverflow.
3 votes
En Bash,
[[ -v VAR]]
est utilisé pour vérifier siVAR
est défini,[[ -z $VAR ]]
est utilisé pour vérifier si"$VAR"
est étendu à une chaîne vide (""
). Ainsi, vous pouvez utiliser[[ -v VAR && -z $VAR ]]
. En savoir plus ici (avec une référence officielle)0 votes
Connexe : [
[[
vs[
](https://unix.stackexchange.com/a/32211)