Bash: Wie verwende ich benutzerdefinierte Funktionen (die „true“ oder „false“ zurückgeben) in bedingten Konstrukten?

Bash: Wie verwende ich benutzerdefinierte Funktionen (die „true“ oder „false“ zurückgeben) in bedingten Konstrukten?

wie verwende ich benutzerdefinierte Methoden richtig, die ein Argument testen, z. B. ob eine Zeichenfolge ein Wort oder eine Versionsnummer ist, in einem bedingten Kontext in if, while, oder until-Anweisungen?

Insbesondere (doppelte) Klammern scheinen bei Methoden auf einer Seite eines Tests wie ein Problem zu haben -gt.

Kann ich einfach eine Methode aufrufen? Wenn ja, welche Kontext-Voraussetzungen gibt es dafür? Also innerhalb/außerhalb von (doppelten) Klammern und in den einzelnen Anweisungen if, whileund until- wie reagieren diese auf den Aufruf von Funktionen ohne Befehlssubstitution?

Und wenn ich keine Befehlssubstitution verwende, um verschiedene Testmethoden aufzurufen, kann ich sie dann trotzdem durch Boolesche Operatoren verbinden?

Gibt es Anwendungsfälle, in denen ich für die Verbindung Klammern oder doppelte Klammern verwenden muss?

Wann benötige ich eine Befehlserweiterung? Könnte es sein, dass ich beim Aufrufen von Funktionen manchmal eine arithmetische Erweiterung benötige?

Antwort1

Sie möchten, dass Ihre Funktion wie alle anderen Befehle [, einschließlich des Befehls, Erfolg/Misserfolg als „true“ oder „false“ über den Beendigungsstatus zurückgibt. Verwenden Sie dazu entweder das returnintegrierte Argument mit 0 für „true“/„Erfolg“ und einen beliebigen anderen Wert für „false“/„Misserfolg“ oder geben Sie einfach das Ende des letzten Befehls zurück, der von der Funktion ausgeführt wurde:

isnewer() {
  [ "$1" -nt "$2" ]
  # here returns with the status of the [ command
}

isvowel() {
  case $1 in
    ([aeiouAEIOU]) true;; # or return 0
    (*) false;;           # or return 1
  esac
}

Dieses gibt den Beendigungsstatus des casezusammengesetzten Befehls zurück, der wiederum den letzten darin ausgeführten Befehl zurückgibt (also entweder den des trueoder des falseBefehls hier).

Und dann rufen Sie in Ihrer if/ while-Anweisung diese Funktionen auf, nicht den [Befehl:

if isnewer /etc/passwd /etc/shadow; then
  echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...

Zu Ihren (für mich unklaren) Verweisen auf doppelte Klammern oder doppelte runde Klammern: while [ist nur ein normaler Befehl (ein anderer Name für den testBefehl), die Korn-Shell und einige Derivate, darunter, bashhaben:

  • eine (( arithmetic expression ))Konstruktion, die den arithmetischen Ausdruck auswertet (wobei sie einer Syntax folgt, die der der Sprache C ähnelt und zwischen Shells variiert) und „true“/„erfolgreich“ zurückgibt (wie üblich über den Exit-Status 0), wenn die resultierende Zahl etwas anderes als 0 ist. Diese Syntax für arithmetische Ausdrücke verfügt über einige Vergleichs- und Boolesche Operatoren, die denen von C ähneln ( <, >=, ||, &&…).
  • eine [[ conditional expression ]]Konstruktion, die den bedingten Ausdruck auswertet (mit einer eigenen Syntax, die ebenfalls von Shell zu Shell variiert und an die Art und Weise erinnert, wie das [Argument analysiert wird). Diese Konstruktion kann wie der Befehl [/ testverwendet werden, um eine Reihe von Tests wie die -ntoben genannten durchzuführen oder Zeichenfolgen oder sogar Zahlen zu vergleichen.

Es gibt jedoch keinen Operator mit doppelten Klammern in Bash.

verwandte Informationen