if else-Anweisung in einer Zeile mit && und ||

7

Ich würde gerne wissen, ob diese beiden Möglichkeiten gleichwertig sind:

Zuerst:

#!/bin/bash
if [ -x $FILE ]
then
  echo "You have execution permission to a "$FILE""
else
  echo "You don't have execution permission to a "$FILE""
fi

Zweite:

#!/bin/bash
[ -x $FILE ] && echo "You have execution permission to a "$FILE"" || echo "You don't have execution permission to a "$FILE""
user3014282
quelle
1
Ihr Zitat ist falsch : [ -x "$FILE" ]; echo "You have execution permission to '$FILE'"
Hauke ​​Laging
Ok, danke, aber anscheinend funktioniert mein Code genauso (möglicherweise nicht mit dem Standard vereinbar :)). Aber sind diese beiden Methoden gleichwertig?
user3014282
1
Ob Ihre Version funktioniert, hängt davon ab, ob der Dateiname Leerzeichen enthält (oder genauer: IFSZeichen).
Hauke ​​Laging

Antworten:

5

Die Strukturen sind im Allgemeinen nicht gleichwertig, in diesem Fall jedoch. Der Grund ist, dass echoimmer Exit-Code 0 vorhanden ist. Wenn dies stattdessen ein Befehl wäre, der mit einem Code größer als Null beendet werden kann, würde auch "der andere Zweig" ausgeführt. Dies ist in diesem ifFall nicht möglich.

Hauke ​​Laging
quelle
2
Der ifFall ist auch viel besser lesbar.
Jkt123
1
@ user3014282: Um die Antwort von Hauke ​​zu erläutern, [ -e /tmp ] && { echo 1 ; false ; } || echo 2werden beide 1und gedruckt 2. Wenn Sie dasselbe mit neu erstellen, if ... then ... else ... fiwird nur gedruckt 1. Ist && ||also kein genaues Äquivalent zum anderen.
Jamadagni