So testen Sie, ob eine Variable einer Zahl in der Shell entspricht


12

Ich habe dieses Shell-Skript, das nicht funktioniert.

Eingang:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

Ausgabe:

Server Name is 1

Aber wenn ich mich ändere Server_Name=2, ist die Ausgabe:

Server Name is 1

Wenn ich ändern Server_Namezu 2, möchte ich es sagen: Server Name is 2.

Ich weiß, dass es der if [ $Server_Name=1 ];Teil ist.

Wie behebe ich das?


Wie David weiter unten ausführt, müssen Sie "-eq" verwenden, um numerische Werte zu testen. Möglicherweise möchten Sie auch nach einer leeren Variablen suchen, um Fehler zu vermeiden. if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Mikebabcock

Antworten:


21

Ihr Skript zeigt an, dass Sie Zeichenfolgenvergleiche verwenden.

Angenommen, der Servername könnte eine Zeichenfolge anstelle einer Zahl sein.

Für String-Vergleiche :
if [[ "$Server_Name" == 1 ]]; then

Anmerkungen:

  • Abstand um == ist ein Muss
  • Abstand um = ist ein Muss
    if [ $Server_Name=1 ]; then ist FALSCH

  • [...]] reduziert Fehler, da zwischen [[und]] keine Pfadnamenerweiterung oder Wortaufteilung stattfindet.

  • Zitieren Sie lieber Zeichenfolgen, die "Wörter" sind.

Für ganzzahlige Vergleiche :
if [[ "$Server_Name" -eq 1 ]]; then


Mehr Informationen:


2
[[ist Bash-Syntax und das OP fragte nach Shell, wo es nicht funktionieren würde
Gilad Mayani


2
[ $Server_Name=1 ]

funktioniert nicht wie beabsichtigt, da die Syntax in den einzelnen Klammern nicht speziell für Bash ist. Wie üblich wird die Variable $Server_Namedurch 1 ersetzt, sodass der Befehl test ( [) nur ein einziges Argument sieht: die Zeichenfolge 1=1. Da dieser Stachel eine von Null verschiedene Länge hat, Test liefert wahr .

Für POSIX-kompatible Shells, können Sie die folgenden verwenden Testbefehle:

[ "$Server_Name" = 1 ]

prüft, ob das $Server_Namegleich der Zeichenfolge ist 1.

[ "$Server_Name" -eq 1 ]

prüft, $Server_Nameob die Zahl gleich ist 1 , dh es wird ein numerischer Vergleich anstelle eines Zeichenfolgenvergleichs durchgeführt.

Der Rückgabewert der beiden Befehle unterscheidet sich, z. B. wenn Sie definieren Server_Name=01. Der erste gibt false zurück, der zweite true.

Beachten Sie, dass wenn die Möglichkeit besteht, dass die Variable $Server_Nameundefiniert ist, sie in Anführungszeichen gesetzt werden muss. Andernfalls zeigt test beim Aufrufen einen Fehler an.


1

Versuchen,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

Ausgabe:

 #./scriptname.sh
 Server Name is below 50

0

Einfache Antwort. Ihr Code ist korrekt - fast. Das einzige, was Sie vermissen, sind Leerzeichen ... (und vielleicht ein zusätzliches "=")

if [ $Server_Name=1 ]; then

wird nicht richtig berechnet.

if [ $Server_Name == 1 ]; then  

ist was du suchst.

Und jetzt die Aussage über String versus Zahlen. Wann immer Sie nach Vergleichen suchen, wie ist / ist-nicht, dann wird == immer in Ordnung sein.

Und ich nehme an, Sie haben immer einen Servernamen als Zeichenfolge, keine Zahl - richtig? ;-);

Viel Glück mit Ihrem stabilen Codierlehrling.

Ciao


Erstaunlich viele Antworten gibt es hier ..
Tobibobi
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.