Vergleichen von Variablen im Skript

Vergleichen von Variablen im Skript

Ich habe diese Anweisung if [ ! - f "$i" -o "$i"x = "$MTR"x]und frage mich, was sie bewirkt. Ich verstehe, dass der erste Teil prüft, ob die Variable ikeine Datei ist, kann aber nicht herausfinden, was der zweite Teil danach ist -o(was, glaube ich, für logisches ODER steht). Jede Hilfe ist sehr hilfreich.

Antwort1

Richtig, das -o steht für ein logisches ODER.
Das "$i"x = "$MTR"xvergleicht den Inhalt der beiden Variablen $iund $MTR.
Ich denke, das xwird zu beiden Variablen hinzugefügt, um Probleme zu vermeiden, wenn eine der beiden Variablen nicht gesetzt oder nicht initialisiert ist.

Antwort2

Angenommen, die Aussage ist

if [ ! -f "$i" -o "$i"x = "$MTR"x ]

Das -f "$i"prüft, ob der Wert $ieiner regulären Datei (oder einem symbolischen Link zu einer regulären Datei) entspricht. Dieser Test wird dann mit negiert !. Das -oist eine veraltete und überholte Art, „logisches ODER“ auszudrücken.

Die "$i"x = "$MTR"xTests erfolgen auf eine etwas umständliche Art und Weise, die bei sehr alten Implementierungen der shShell möglicherweise notwendig war, ob $iund $MTRderselbe String sind.

In einer (aktuellen) Standard- shShell würde die Anweisung wie folgt lauten:

if [ ! -f "$i" ] || [ "$i" = "$MTR" ]

oder, mit ein wenig Logik,

if [ "$i" = "$MTR" ] && [ -f "$i" ] || [ ! -f "$i" ]

In Worten: Die Aussage ist wahr, wenn $iderselbe String wie ist $MTRund auf eine vorhandene reguläre Datei (oder einen symbolischen Link darauf) verweist, oder wenn $inicht der Name einer Datei ist.

Interessanter ist vielleicht, sich anzuschauen, was diese Aussage bedeutet:FALSCH. Es ist nur dann falsch, wenn $iund $MTRnicht derselbe String istUnd $iverweist auf eine vorhandene Datei.

verwandte Informationen