Ich versuche immer, bei POSIX zu bleiben. sh
statt Bash-Erweiterungen zu verwenden, da einer der wichtigsten Punkte beim Skripting die Portabilität ist (neben Verbindung Programme, nicht deren Ersetzung).
Sur sh
gibt es eine einfache Möglichkeit, auf eine "is-prefix"-Bedingung zu prüfen.
case $HOST in node*)
# Your code here
esac
Wenn man bedenkt, wie alt, geheimnisvoll und verkrustet sh ist (und Bash ist nicht das Heilmittel: Sie ist komplizierter, weniger konsistent und weniger portabel), möchte ich auf einen sehr schönen funktionalen Aspekt hinweisen: Während einige Syntaxelemente wie case
eingebaut sind, unterscheiden sich die daraus resultierenden Konstrukte nicht von jedem anderen Auftrag. Sie können auf dieselbe Weise zusammengesetzt werden:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Oder noch kürzer
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Oder sogar kürzer (nur zur Vorstellung !
als ein Sprachelement - aber das ist jetzt schlechter Stil)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Wenn Sie gerne explizit sind, bauen Sie Ihr eigenes Sprachelement:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Ist das nicht eigentlich ganz nett?
if beginswith node "$HOST"; then
# Your code here
fi
Und da sh
im Grunde nur aus Jobs und String-Listen besteht (und intern aus Prozessen, aus denen Jobs zusammengesetzt sind), können wir jetzt sogar ein wenig funktionale Programmierung betreiben:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
Das ist elegant. Nicht, dass ich es befürworten würde, die sh
für irgendetwas Ernstes - es bricht allzu schnell an den Anforderungen der realen Welt (keine Lambdas, also müssen wir Strings verwenden. Aber die Verschachtelung von Funktionsaufrufen mit Strings ist nicht möglich, Pipes sind nicht möglich, usw.)