2012-11-22 2 views
45

Ich versuche, das folgende Shell-Skript auszuführen, das überprüfen soll, ob eine Zeichenfolge weder Leerzeichen noch leer ist. Allerdings bekomme ich für alle 3 Saiten die gleiche Ausgabe. Ich habe versucht, die "[[" - Syntax ebenfalls zu verwenden, aber ohne Erfolg.Überprüfen Sie, ob der String im Shell-Skript leer oder leer ist

Hier ist mein 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 

ich die folgende Ausgabe bin immer:

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

Antwort

76

Sie benötigen einen Platz auf beiden Seiten der !=. Ändern Sie Ihren 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 
+0

Vielen Dank, es funktioniert. Aber ich frage mich, warum die Zuweisung kein Leerzeichen verwendet, während ein Vergleich dies tut. –

+5

^^ Es ist Syntax. Das erste Wort in der Befehlszeile ist der Befehl und nachfolgende sind Argumente. 'var = value [Befehl [args]]' ist die Syntax, in der einer Variablen ein Wert zugewiesen wird. zum Vergleich: '['/usr/bin/['] ist der Befehl & es erfordert var1,! = & var2 als 3 separate Argumente. var1! = var2 ist ein einzelnes Argument. – anishsane

+0

@anishsane Vielen Dank für das Detail, ich bekomme es jetzt =) –

40

Für die leere Zeichenfolge in der Schale

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

ODER

if [ ! "$str" ];then 
    echo NULL 
fi 
Überprüfung
+4

Die Zeichenfolge Gleichheitsoperator Shell ist '='. Der '==' ist ein nicht-portabler Hack, der von Shell-Autoren erfunden wurde, um die Gedanken junger Programmierer zu verwirren. – Jens

6

Um zu prüfen, ob ein String leer ist oder nur Leerzeichen Sie nutzen könnten:

shopt -s extglob # more powerful pattern matching 

if [ -n "${str##+([[:space:]])}" ]; then 
    echo '$str is not null or space' 
fi 

Siehe Shell Parameter Expansion und Pattern Matching in der Bash-Handbuch.

+1

Könnten Sie das ein bisschen zu Lernzwecken erklären? Das sieht nach Kauderwelsch aus ^^; Ist das wie Grep oder so? –

+1

@Keith M: Überprüfen Sie die Links zu den Dokumenten, die ich in dem Beitrag zur Verfügung gestellt habe. –

11

Im Fall, dass Sie gegen eine Menge von Leerzeichen zu überprüfen, nicht nur einzelner Raum, können Sie dies tun:

Um Reihe von zusätzlichem Leer Streife (auch condences Leerzeichen in der Mitte zu einem Raum):

trimmed=`echo -- $original` 

die -- stellt sicher, dass, wenn $original Schalter durch Echo verstanden enthält, werden sie immer noch als normale Argumente Echo werden in Betracht gezogen werden. Auch ist es wichtig, "" um $original nicht zu setzen, oder die Räume werden nicht entfernt.

Danach können Sie nur überprüfen, ob $trimmed leer ist.

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

In Bourne Shell endet ich mit "-" als Wert von getrimmt. –

2

Ein weiterer schneller Test für eine Zeichenfolge, um etwas zu haben, aber Platz.

if [[ ! -z "${str/ //}" ]]; then 
    echo "It is not empty!" 
fi 
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty" 

alle Zeilenumbrüche und Leerzeichen aus der Zeichenfolge eine leere eins reduziert wird dazu führen, nichts zu entkleiden, die getestet werden können und beaufschlagten