
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 i
keine 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"x
vergleicht den Inhalt der beiden Variablen $i
und $MTR
.
Ich denke, das x
wird 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 $i
einer regulären Datei (oder einem symbolischen Link zu einer regulären Datei) entspricht. Dieser Test wird dann mit negiert !
. Das -o
ist eine veraltete und überholte Art, „logisches ODER“ auszudrücken.
Die "$i"x = "$MTR"x
Tests erfolgen auf eine etwas umständliche Art und Weise, die bei sehr alten Implementierungen der sh
Shell möglicherweise notwendig war, ob $i
und $MTR
derselbe String sind.
In einer (aktuellen) Standard- sh
Shell 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 $i
derselbe String wie ist $MTR
und auf eine vorhandene reguläre Datei (oder einen symbolischen Link darauf) verweist, oder wenn $i
nicht der Name einer Datei ist.
Interessanter ist vielleicht, sich anzuschauen, was diese Aussage bedeutet:FALSCH. Es ist nur dann falsch, wenn $i
und $MTR
nicht derselbe String istUnd $i
verweist auf eine vorhandene Datei.