#!/bin/bash
# str-test.sh: Tester des chaînes vides sans guillemets,
# "but not strings and sealing wax, not to mention cabbages and kings..."
# (extrait de l'histoire des huîtres, dans "Alice au Pays des Merveilles")

# Utilisation de   if [ ... ]

#  Tant qu'une chaîne n'a pas été initialisée, elle n'a aucune valeur définie.
#  Cet état est appelé "vide" (en anglais "null", ce n'est pas la
#+ même chose que zéro).

if [ -n $chaine1 ]    # $chaine1 n'a été ni déclarée ni initialisée.
then
  echo "La chaîne \"chaine1\" n'est pas vide."
else  
  echo "La chaîne \"chaine1\" est vide."
fi  
# Mauvais résultat.
# Affiche $chaine1 comme non vide alors qu'elle n'a pas été initialisée.


echo


# Nouvel essai.

if [ -n "$chaine1" ]  # Cette fois, $chaine1 est entre guillemets.
then
  echo "La chaîne \"chaine1\" n'est pas vide."
else  
  echo "La chaîne \"chaine1\" est vide."
fi      # Il faut échapper les chaînes à l'intérieur des crochets de test !


echo


if [ $chaine1 ]       # À présent, $chaine1 est toute seule.
then
  echo "La chaîne \"chaine1\" n'est pas vide."
else  
  echo "La chaîne \"chaine1\" est vide."
fi  
# Ça marche.
# L'opérateur de test [ ] tout seul détecte que la chaîne est vide.
# Néanmoins, il est de bonne pratique de mettre des guillemets ("$chaine1").
#
# Comme dirait Stéphane Chazelas :
#    if [ $chaine1 ]    a un seul argument, "]"
#    if [ "$chaine1" ]  a deux arguments, la chaîne vide "$chaine1" et "]" 


echo


chaine1=initialisée

if [ $chaine1 ]       # Cette fois encore, $chaine1 est sans guillemets.
then
  echo "La chaîne \"chaine1\" n'est pas vide."
else  
  echo "La chaîne \"chaine1\" est vide."
fi  
# De nouveau, on a le résultat correct.
# Malgré tout, il vaut mieux mettre "$chaine1" entre guillemets, parce
# que...


chaine1="a = b"

if [ $chaine1 ]       # $chaine1 est encore sans guillemets.
then
  echo "La chaîne \"chaine1\" n'est pas vide."
else  
  echo "La chaîne \"chaine1\" est vide."
fi  
# Ne pas mettre "$chaine1" entre guillemets donne un résultat faux !

exit 0
# Merci également à Florian Wisser pour sa vigilance.
