Was ist die portabelste Syntax für „if“-Anweisungen?

Was ist die portabelste Syntax für „if“-Anweisungen?

(HINWEIS: Es gibteine ganz ähnliche Frage, gestern seltsamerweise gestellt, aber es deckt nicht die wichtigsten Syntaxen ab, die mich interessieren. Wenn ich die andere Frage aktualisieren würde, um sie aufzunehmen, könnten die Antworten ungültig werden, daher werde ich mich hier auf das konzentrieren, was in der anderen Frage fehlte. Wer das Gesamtbild haben möchte, sollte sich beide Fragen und ihre akzeptierten Antworten ansehen.)

Normalerweise schreibe ich meine if-Anweisungen wie folgt:

if [[ -z "$SOMETHING" ]]; then
  # blah blah blah
fi

das funktioniert bei mir unter Bash und Z Shell gut, aber ich bin vor kurzem aufeine Syntax, die die eckigen Klammern vollständig weglässt:

if command -v given-command > /dev/null 2>&1; then
  echo given-command is available
else
  echo given-command is not available
fi

Ist die Version ohne Klammern portierbar? Wie ist sie im Vergleich zu den vorgestellten Optionen?Hier?

Wird meine Standardversion hauptsächlich nur auf Bash und Z Shell unterstützt (wie die [[ -w /home/durrantm ]] && echo "writable"in der anderen Frage erwähnte Version)?

Antwort1

Ja, Ihre Standardversion entspricht nicht dem POSIX-Standard, wie aus der Frage hervorgeht, auf die Sie verlinkt haben. Folgendes ist jedoch der Fall:

if some-command args; then ...

Ich würde sagen, dass dies die einzige portable Form von ist if, da es ifgenau darum geht. iftut etwas, wenn (was eine Funktion, ein integriertes Shell-Element oder eine ausführbare Datei 1some-command sein kann ) die Argumente und Eingaben zurückgibt, mit denen es ausgeführt wird.0

if [ ]Wenn Sie oder ausführen if [[ ]], sind [ ]und [[ ]]Programme oder integrierte Shell-Funktionen, die zurückkehren, 0wenn die Bedingung erfüllt ist. Wenn Sie [in konvertieren test, werden Sie sehen, dass Sie die Form immer ohne Klammern ausführen:

if [ ... ]
# same as 
if /bin/test ...

1 Um genauer zu sein, schauen wir uns an, wie das ifKonstruktist definiert:

DerWennBefehl führt einenzusammengesetzte Listeund verwenden Sie den Beendigungsstatus, um zu bestimmen, ob ein weitererzusammengesetzte Liste.

Das Format für dieWennDas Konstrukt ist wie folgt:

if compound-list 
then
    compound-list
[elif compound-list 
then
    compound-list] ...
[else
    compound-list]
fi

Beachten Sie, dass einzusammengesetzte Listeist nicht dasselbe wie einzusammengesetzter Befehl.

verwandte Informationen