Überprüfen Sie, ob die Zeichenfolge im Shell-Skript weder leer noch leer ist

91

Ich versuche, das folgende Shell-Skript auszuführen, das prüfen soll, ob eine Zeichenfolge weder Leerzeichen noch Leerzeichen enthält. Ich erhalte jedoch die gleiche Ausgabe für alle 3 genannten Zeichenfolgen. Ich habe versucht, auch die Syntax "[[" zu verwenden, aber ohne Erfolg.

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 erhalte die folgende Ausgabe:

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

Antworten:

120

Sie benötigen einen Platz auf beiden Seiten des !=. Ändern Sie Ihren Code in:

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
quelle
Vielen Dank, es funktioniert. Aber ich frage mich, warum die Aufgabe kein Leerzeichen verwendet, während ein Vergleich dies tut.
Shubhanshu Mishra
5
^^ Es ist Syntax. Das erste Wort in der Befehlszeile ist der Befehl und die nachfolgenden sind Argumente. var=value [command [args]]ist die Syntax, in der einer Variablen ein Wert zugewiesen wird. Zum Vergleich ist [( /usr/bin/[) der Befehl und erfordert, dass var1 ,! = & var2 3 separate Argumente sind. var1! = var2 ist ein einzelnes Argument.
Anishsane
61

Zum Überprüfen der leeren Zeichenfolge in der Shell

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

ODER

if [ ! "$str" ];then
   echo NULL
fi
RajeshKashyap
quelle
9
Der String-Gleichheitsoperator der Shell lautet =. Dies ==ist ein nicht portabler Hack, der von Shell-Autoren erfunden wurde, um die Gedanken junger Programmierer durcheinander zu bringen.
Jens
17

Wenn Sie nicht nur einzelne Leerzeichen, sondern auch Leerzeichen überprüfen müssen, können Sie Folgendes tun:

So entfernen Sie eine Reihe von zusätzlichen Leerzeichen (verdichtet auch Leerzeichen in der Mitte auf ein Leerzeichen):

trimmed=`echo -- $original`

Die --stellt sicher , dass , wenn $originalenthält Schalter durch Echo verstanden, werden sie immer noch als normale Argumente betrachtet werden werden wiederholt. Es ist auch wichtig, nicht zu setzen ""um $original, oder die Räume werden nicht entfernt bekommen.

Danach können Sie einfach überprüfen, ob $trimmedes leer ist.

[ -z "$trimmed" ] && echo "empty!"
Hyde
quelle
3
In der Bourne-Shell habe ich "-" als Wert für "getrimmt".
Sridhar Sarnobat
Laut diesem Beitrag interpretiert Echo nicht - um das Ende von Optionen zu bedeuten. In meiner Bash-Shell erhalte ich das gleiche Ergebnis wie Sridhar Sarnobat
Mr.C
9

Ein weiterer schneller Test für eine Zeichenfolge, um etwas anderes als Leerzeichen zu enthalten.

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

"-n" bedeutet eine Zeichenfolge ungleich Null.

Dann stimmen die ersten beiden Schrägstriche mit allen folgenden Punkten überein , in unserem Fall mit Leerzeichen. Dann folgt auf den dritten Schrägstrich die Ersatzzeichenfolge (leer) und wird mit "}" geschlossen. Beachten Sie den Unterschied zur üblichen Syntax für reguläre Ausdrücke.

Weitere Informationen zur Manipulation von Zeichenfolgen in Bash-Shell-Skripten finden Sie hier .

elomage
quelle
ist nicht [[ -n "$1" ]]dasselbe wie [[ ! -z "$1" "]]?
Alexander Mills
@AlexanderMills Sie haben Recht, die Verwendung von -n würde es etwas kürzer machen. Ich habe gerade die Antwort entsprechend aktualisiert.
Elomage
6

So überprüfen Sie, ob eine Zeichenfolge leer ist oder nur Leerzeichen enthält:

shopt -s extglob  # more powerful pattern matching

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

Siehe Shell-Parametererweiterung und Musteranpassung im Bash-Handbuch.

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

Wenn Sie alle Zeilenumbrüche und Leerzeichen aus der Zeichenfolge entfernen, wird eine leere Zeile auf nichts reduziert, was getestet und bearbeitet werden kann

Harte Shandilya
quelle