Ce que vous cherchez, c'est l'indirection.
assertNotEmpty() {
: "${!1:? "$1 is empty, aborting."}"
}
Cela entraîne l'abandon du script avec un message d'erreur si vous faites quelque chose comme ceci :
$ foo=""
$ assertNotEmpty foo
bash: !1: foo is empty, aborting.
Si vous voulez juste test si foo
est vide, au lieu d'interrompre le script, utilisez ceci à la place d'une fonction :
[[ $foo ]]
Par exemple :
until read -p "What is your name? " name && [[ $name ]]; do
echo "You didn't enter your name. Please, try again." >&2
done
Notez également qu'il existe un différence très importante entre un vide et un non activé paramètre. Il faut faire attention à ne pas confondre ces termes ! Un paramètre vide est un paramètre qui est défini, mais juste défini par une chaîne vide. Un paramètre non défini est un paramètre qui n'existe pas du tout.
Les exemples précédents testent tous la présence de vide paramètres. Si vous voulez tester non activé et considérer tous les paramètres définis comme OK, qu'ils soient vides ou non, utilisez ceci :
[[ ! $foo && ${foo-_} ]]
Utilisez-le dans une fonction comme celle-ci :
assertIsSet() {
[[ ! ${!1} && ${!1-_} ]] && {
echo "$1 is not set, aborting." >&2
exit 1
}
}
Ce qui n'interrompt le script que lorsque le nom du paramètre que vous passez désigne un paramètre qui n'est pas défini :
$ ( foo="blah"; assertIsSet foo; echo "Still running." )
Still running.
$ ( foo=""; assertIsSet foo; echo "Still running." )
Still running.
$ ( unset foo; assertIsSet foo; echo "Still running." )
foo is not set, aborting.
0 votes
Votre titre dit "unset", mais votre exemple teste "unset ou set à la chaîne vide". Quel est le cas qui vous intéresse ?