Warum gleich-operator funktioniert nicht, wenn es ist nicht umgeben von Raum?
Habe ich versucht, das folgende Skript
#!/bin/bash
var1="Test 1"
var2="Test 2"
if [ "$var1"="$var2" ]
then
echo "Equal"
else
echo "Not equal"
fi
Er gab mir Equal
. Obwohl es ausgedruckt haben Not equal
Nur, wenn ich eingefügt Platz um =
es funktionierte wie vorgesehen
if [ "$var1" = "$var2" ]
und gedruckt Not equal
Warum ist es so? Warum "$var1"="$var2"
ist nicht dasselbe wie "$var1" = "$var2"
?
Darüber hinaus, als ich schrieb if [ "$var1"= "$var2" ]
es gab
line 4: [: Test 1=: unary operator expected
Was hat es zu bedeuten? Wie kommt Ihr erwarten unärer operator?
Du musst angemeldet sein, um einen Kommentar abzugeben.
test
(oder[ expr ]
) ist eine eingebaute Funktion. Wie alle Funktionen in der bash, die Sie übergeben der Argumente als whitespace-Zeichen getrennte Wörter.Als der man-page für die bash gelieferten besagt: "Jeder operator und operand muss ein separates argument."
Es ist nur die Art, wie die bash und die meisten anderen Unix-shells arbeiten.
Variable Belegung ist anders.
In der bash eine variable Zuordnung hat die syntax:
name=[value]
. Sie können nicht ohne Anführungszeichen Leerzeichen um die=
weil bash würde nicht interpretieren dies als die Aufgabe, die Sie wollen. bash behandelt die meisten Listen von Wörtern als einen Befehl mit Parameter.E. g.
var = "test" ;
funktioniert nicht? Damit es funktioniert, muss ich Leerzeichen entfernenvar="test";
Ist die Zuordnung=
ist kein Betreiber?test
builtin-Funktion. In der bash eine variable Zuordnung ist Teil der shell Grammatik, es ist nicht eine Funktion. Es erfordert keine Leerzeichen.Wird, wenn die shell liest
es ruft den Befehl [ mit 4 Argumenten. Ob [ eine eingebaute oder ein externer Befehl ist irrelevant, aber es kann helfen, zu verstehen, dass es sein kann das externe Kommando /bin/[. Das zweite argument ist das Zeichen '=' und das vierte ']'. Allerdings, wenn die shell liest
[ bekommt nur 3 Argumente: die expansion von $var1 mit '=' angehängt, der ausbau von $var2, und ']'. Wenn es nur 3 Argumente, es erwartet, dass die letzten argument ']' und das erste argument ein unärer operator.
Hinzufügen, um die bestehende Erklärung
"$var1"="$var2"
ist nur eine einzelne nicht-leerer string ist, und somit immer als true ausgewertet wird, der in einem bedingten.Dem obigen Befehl wird immer ausdrucken
true
(auch wennvar1
undvar2
leer sein).In der bash der besten ist die Verwendung von [[ ]]:
[[
unterliegt der gleichen shell-syntax als alle anderen Konstrukte. Der Wechsel zu[[
nicht lösen würde das OP-problem. Als ob das "besser" hängt davon ab, ob Sie priorisieren Komfort über Portabilität. Wenn Sie sich zur Bash-nur, es ist wahrscheinlich wahr.