Klammern in der Shell (einschließlich einfacher Klammern und doppelter Klammern) können zum Testen bestimmter Bedingungen verwendet werden:

  • Arithmetischer Vergleich, zum Beispiel, ob eine Variable 0 ist,[ $var -eq 0 ]。
  • Testen von Dateiattributen, zum Beispiel, ob eine Datei existiert,[ -e $var ], ob es sich um ein Verzeichnis handelt,[ -d $var ]。
  • Zeichenkettenvergleich, zum Beispiel, ob zwei Zeichenketten gleich sind,[[ $var1 = $var2 ]]。

[] kann oft durch den Befehl test ersetzt werden, der später vorgestellt wird.

Arithmetischer Vergleich

Arithmetische Bedingungsprüfung für Variablen oder Werte durchführen:

[ $var -eq 0 ]  # 当 $var 等于 0 时,返回真
[ $var -ne 0 ]  # 当 $var 不等于 0 时,返回真

Beachten Sie, dass zwischen [ und ] und den Operanden ein Leerzeichen stehen muss, andernfalls wird ein Fehler gemeldet. Zum Beispiel verursacht Folgendes einen Fehler:

[$var -eq 0 ]  oder  [ $var -ne 0] 

Weitere Vergleichsoperatoren:

Operator Bedeutung
-gt Größer als
-lt Kleiner als
-ge Größer als oder gleich
-le Kleiner als oder gleich

Sie können mehrere Bedingungen zum Testen mit -a (und) oder -o (oder) kombinieren:

[ $var1 -ne 0 -a $var2 -gt 2 ]  # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ]  # 使用逻辑或 -o

Testen von Dateisystem-Attributen

Verwenden Sie verschiedene Bedingungsflags, um verschiedene Dateisystemattribute zu testen.

Operator Bedeutung
[ -f $file_var ] Gibt true zurück, wenn die Variable $file_var ein normaler Dateipfad oder Dateiname ist (file)
[ -x $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei ausführbar ist (execute)
[ -d $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei ein Verzeichnis ist (directory)
[ -e $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei existiert (exist)
[ -c $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei eine Zeichengerätedatei ist (character)
[ -b $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei eine Blockgerätedatei ist (block)
[ -w $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei beschreibbar ist (write)
[ -r $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei lesbar ist (read)
[ -L $var ] Gibt true zurück, wenn die in der Variable $var enthaltene Datei ein symbolischer Link ist (link)

Die Verwendung ist wie folgt:

fpath="/etc/passwd"
if [ -e $fpath ]; then
  echo File exits;
else
  echo Does not exit;
fi

String-Vergleich

Beim Vergleich von Zeichenketten sollten Sie am besten doppelte eckige Klammern [[ ]] verwenden. Da einfache Klammern einige Fehler verursachen können, sollten sie am besten vermieden werden.

Prüfen Sie, ob zwei Zeichenketten gleich sind:

[[ $str1 = $str2 ]]

Gibt true zurück, wenn str1 gleich str2 ist. Das heißt, der in str1 und str2 enthaltene Text ist derselbe. Das einfache Gleichheitszeichen kann auch als doppeltes Gleichheitszeichen geschrieben werden, was bedeutet, dass der obige Zeichenkettenvergleich äquivalent zu [[ $str1 == $str2 ]] ist.

Beachten Sie, dass sich vor und nach = ein Leerzeichen befindet. Wenn Sie vergessen, das Leerzeichen hinzuzufügen, wird daraus eine Zuweisungsanweisung statt einer Vergleichsbeziehung.

Weitere Vergleichsfälle für Zeichenketten:

Operator Bedeutung
[[ $str1 != $str2 ]] Gibt true zurück, wenn str1 und str2 nicht gleich sind
[[ -z $str1 ]] Gibt true zurück, wenn str1 eine leere Zeichenkette ist
[[ -n $str1 ]] Gibt true zurück, wenn str1 eine nichtleere Zeichenkette ist

Mit den logischen Operatoren && und || können Sie mehrere Bedingungen einfach kombinieren, zum Beispiel:

str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
  echo str1 is nonempty and str2 is empty string.
fi

Der Befehl test kann auch zur Bedingungsprüfung verwendet werden. Durch die Verwendung von test können zu viele Klammern vermieden werden. Die Testbedingungen in [] können auch durch test umgesetzt werden.

if [ $var -eq 0 ]; then echo "True"; fi

Entspricht:

if test $var -eq 0; then echo "True"; fi

Autor: liuchengxu_

Original: https://blog.csdn.net/simple_the_best/article/details/75915767