Ich versuche immer, bei POSIX zu bleiben, sh
anstatt Bash-Erweiterungen zu verwenden, da einer der Hauptpunkte der Skripterstellung die Portabilität ist (neben dem Verbinden von Programmen, nicht deren Ersetzen).
Im sh
gibt es eine einfache Möglichkeit, nach einer "is-prefix" -Bedingung zu suchen.
case $HOST in node*)
# Your code here
esac
In Anbetracht dessen, wie alt, arkan und crufty sh ist (und Bash ist nicht das Heilmittel: Es 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 Die resultierenden Konstrukte unterscheiden sich nicht von anderen Jobs. Sie können auf die gleiche 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 noch kürzer (nur um !
als Sprachelement zu präsentieren - aber das ist jetzt ein schlechter Stil)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Wenn Sie explizit sein möchten, erstellen 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 seit sh
es sich im Grunde nur um Jobs und String-Listen handelt (und um interne Prozesse, aus denen Jobs bestehen), können wir jetzt sogar eine leichte funktionale Programmierung durchführen:
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 die Verwendung sh
für irgendetwas Ernstes befürworten würde - es bricht allzu schnell bei realen Anforderungen ab (keine Lambdas, daher müssen wir Zeichenfolgen verwenden. Verschachtelungsfunktionsaufrufe mit Zeichenfolgen sind jedoch nicht möglich, Pipes sind nicht möglich usw.)