web-dev-qa-db-fra.com

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

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
80
Shubhanshu Mishra

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
104
dogbane

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

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

OR

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

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!"
16
hyde

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 .

7
elomage

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.

6
Eugene Yarmash
[ $(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.

1
Harsh Shandilya