J'essaie d'exécuter le script Shell suivant, qui est censé vérifier si une chaîne n'est ni un espace ni vide. Cependant, je reçois la même sortie pour les 3 chaînes mentionnées. J'ai aussi essayé d'utiliser la syntaxe "[[" mais en vain.
Voici mon code:
str="Hello World"
str2=" "
str3=""
if [ ! -z "$str" -a "$str"!=" " ]; then
echo "Str is not null or space"
fi
if [ ! -z "$str2" -a "$str2"!=" " ]; then
echo "Str2 is not null or space"
fi
if [ ! -z "$str3" -a "$str3"!=" " ]; then
echo "Str3 is not null or space"
fi
Je reçois la sortie suivante:
# ./checkCond.sh
Str is not null or space
Str2 is not null or space
Vous avez besoin d'un espace de chaque côté du !=
. Changez votre code pour:
str="Hello World"
str2=" "
str3=""
if [ ! -z "$str" -a "$str" != " " ]; then
echo "Str is not null or space"
fi
if [ ! -z "$str2" -a "$str2" != " " ]; then
echo "Str2 is not null or space"
fi
if [ ! -z "$str3" -a "$str3" != " " ]; then
echo "Str3 is not null or space"
fi
Pour vérifier la chaîne vide dans le shell
if [ "$str" == "" ];then
echo NULL
fi
OR
if [ ! "$str" ];then
echo NULL
fi
Au cas où vous auriez besoin de vérifier n'importe quel espace, pas seulement un espace, vous pouvez le faire:
Pour supprimer une chaîne d’espace blanc supplémentaire (condence également à un espace):
trimmed=`echo -- $original`
Le --
garantit que si $original
contient des commutateurs compris par écho, ils seront toujours considérés comme des arguments normaux à répercuter. De plus, il est important de ne pas mettre ""
autour de $original
, sinon les espaces ne seront pas supprimés.
Après cela, vous pouvez simplement vérifier si $trimmed
est vide.
[ -z "$trimmed" ] && echo "empty!"
Un autre test rapide pour qu'une chaîne contienne quelque chose mais de l'espace.
if [[ -n "${str// /}" ]]; then
echo "It is not empty!"
fi
"-n" signifie une chaîne de longueur non nulle.
Ensuite, les deux premières barres obliques signifient une correspondance avec tout des éléments suivants, dans notre cas, espace (s). Ensuite, la troisième barre oblique est suivie de la chaîne de remplacement (vide) et fermée par "}". Notez la différence avec la syntaxe habituelle des expressions régulières.
Vous pouvez en savoir plus sur manipulation des chaînes dans les scripts du shell bash ici .
Pour vérifier si une chaîne est vide ou ne contient que des espaces, vous pouvez utiliser:
shopt -s extglob # more powerful pattern matching
if [ -n "${str##+([[:space:]])}" ]; then
echo '$str is not null or space'
fi
Voir Expansion des paramètres du shell et Correspondance de modèle dans le manuel Bash.
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"
En supprimant toutes les nouvelles lignes et les espaces de la chaîne, une ligne vierge sera réduite à néant et ne pourra être testée et utilisée.