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
Shubhanshu Mishra
la source

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
dogbane
la source
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
RajeshKashyap
la source
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!"
Hyde
la source
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 .

élomage
la source
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
6

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 Extension des paramètres du shell et correspondance de motifs dans le manuel de Bash.

Eugène Yarmash
la source
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

Harsh Shandilya
la source