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_Name
zu 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?
linux
bash
shell
shell-script
user2649805
quelle
quelle
if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Antworten:
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
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:
quelle
[[
ist Bash-Syntax und das OP fragte nach Shell, wo es nicht funktionieren würdeVersuche dies:
quelle
funktioniert nicht wie beabsichtigt, da die Syntax in den einzelnen Klammern nicht speziell für Bash ist. Wie üblich wird die Variable
$Server_Name
durch 1 ersetzt, sodass der Befehl test ([
) nur ein einziges Argument sieht: die Zeichenfolge1=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:
prüft, ob das
$Server_Name
gleich der Zeichenfolge ist1
.prüft,
$Server_Name
ob die Zahl gleich ist1
, 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_Name
undefiniert ist, sie in Anführungszeichen gesetzt werden muss. Andernfalls zeigt test beim Aufrufen einen Fehler an.quelle
Versuchen,
Ausgabe:
quelle
Einfache Antwort. Ihr Code ist korrekt - fast. Das einzige, was Sie vermissen, sind Leerzeichen ... (und vielleicht ein zusätzliches "=")
wird nicht richtig berechnet.
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
quelle