134 votes

Vérifier si la chaîne n'est ni vide ni un espace dans le shell script.

J'essaie d'exécuter le shell script suivant qui est censé vérifier si une chaîne de caractères n'est ni espace ni vide. Cependant, j'obtiens la même sortie pour les 3 chaînes de caractères mentionnées. J'ai également 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

J'obtiens le résultat suivant :

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

162voto

dogbane Points 85749

Vous avez besoin d'un espace de chaque côté de la != . Changez votre code en :

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

82voto

RajeshKashyap Points 859

Pour vérifier la chaîne vide dans le shell

if [ "$str" == "" ];then
   echo NULL
fi

OU

if [ ! "$str" ];then
   echo NULL
fi

20voto

hyde Points 13720

Si vous avez besoin de vérifier n'importe quelle quantité d'espace, et pas seulement un espace unique, vous pouvez le faire :

Pour supprimer les espaces blancs supplémentaires d'une chaîne de caractères (condense également les espaces blancs du milieu en un seul espace) :

trimmed=`echo -- $original`

El -- garantit que si $original contient des interrupteurs compris par echo, ils seront toujours considérés comme des arguments normaux à être échangés. Il est également important de ne pas mettre "" autour de $original ou les espaces ne seront pas supprimés.

Après cela, vous pouvez simplement vérifier si $trimmed est vide.

[ -z "$trimmed" ] && echo "empty!"

17voto

elomage Points 583

Un autre test rapide pour qu'une chaîne de caractères contienne autre chose qu'un espace.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" signifie une chaîne de longueur non nulle.

Alors les deux premières barres obliques signifient la correspondance tous des éléments suivants, dans notre cas l'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 de chaînes de caractères dans les scripts shell bash ici .

9voto

eugene y Points 37378

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 de l'enveloppe y Correspondance de motifs dans le manuel Bash.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X