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


91

J'essaie d'exécuter le script shell suivant qui est censé vérifier si une chaîne n'est ni espace ni vide. Cependant, j'obtiens le même résultat pour les 3 chaînes 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 la sortie suivante:

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

Réponses:


121

Vous avez besoin d'un espace de chaque côté du !=. 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

Merci beaucoup, ça marche. Mais je me demande pourquoi l'affectation n'utilise pas d'espace alors qu'une comparaison le fait.
Shubhanshu Mishra

5
^^ C'est la syntaxe. Le premier mot sur la ligne de commande est la commande et les suivants sont des arguments. var=value [command [args]]est la syntaxe dans laquelle une variable reçoit une valeur. à titre de comparaison, [( /usr/bin/[) est la commande et nécessite que var1,! = & var2 soit 3 arguments séparés. var1! = var2 est un seul argument.
anishsane

61

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

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

OU

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

9
L'opérateur d'égalité de chaîne du shell est =. Le ==est un hack non portable inventé par des auteurs de shell pour gâcher l'esprit des jeunes programmeurs.
Jens

17

Au cas où vous auriez besoin de vérifier par rapport à n'importe quelle quantité d'espace blanc, pas seulement à un seul espace, vous pouvez le faire:

Pour dépouiller une chaîne d'espace blanc supplémentaire (condense également les espaces blancs au milieu à un espace):

trimmed=`echo -- $original`

Le --garantit que s'il $originalcontient des commutateurs compris par echo, ils seront toujours considérés comme des arguments normaux à écho. Il est également important de ne pas mettre ""autour $original, sinon les espaces ne seront pas supprimés.

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

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

3
Dans bourne shell, je me retrouve avec "-" comme valeur de trimmed.
Sridhar Sarnobat

Selon cet article , l'écho n'interprète pas - signifie la fin des options. Dans mon shell Bash, j'obtiens le même résultat que Sridhar Sarnobat
Mr.C

9

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 différente de zéro.

Ensuite, les deux premières barres obliques signifient correspondre à tous les éléments suivants, dans notre ou nos espaces. 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 la manipulation de chaînes dans les scripts bash shell ici .


n'est pas [[ -n "$1" ]]le même que [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills vous avez raison, utiliser -n le rendrait un peu plus court. Je viens de mettre à jour la réponse en conséquence.
elomage


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

En supprimant toutes les nouvelles lignes et tous les espaces de la chaîne, un vide sera réduit à rien qui puisse être testé et agi

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.