Ü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

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

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

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

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 .


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.