
Ein Zsh-Skript, das ausgeführt wird: script.zsh nameabc01
Ich script.zsh
muss überprüfen, ob es nameabc01
diesem Muster entspricht na*abc*
oder nicht, um fortzufahren, etwas zu tun oder zu entscheiden, das Skript zu beenden.
Wie können wir das erreichen?
und um diese Frage zu erweitern: Wie können wir das erreichen, indem wir eine Überprüfung anhand einer Liste von Mustern in einer Datei durchführen (durch Zeilenumbrüche getrennt)?
Antwort1
Testen Sie, ob Argumente vorhanden sind und ob das erste Argument einem Glob-Muster entspricht:
#!/usr/bin/env zsh
if (( # == 0 )); then
print >&2 "Usage: $0 na*abc* ..."
exit 1
fi
if [[ $1 != na*abc* ]]; then
print >&2 "not ok"
exit 1
fi
(Ja, ich rücke Shell-Skripte um drei Leerzeichen ein und nein, ich füge ihnen niemals *.zsh
oder Erweiterungen hinzu), was getestet werden kann:*.sh
% ./argchecker
Usage: ./argchecker na*abc* ...
% ./argchecker wombat
not ok
% ./argchecker na1abc1
% ./argchecker na1111111111abc1111111111
%
Wenn Sie zulassen, na1abc1
aber nicht zulassen möchten na1111111111abc1111111111
, müssen Sie ?
anstelle von verwenden *
oder stattdessen zu einer regulären Ausdrucksübereinstimmung mit =~
und einem geeigneten regulären Ausdruck wechseln.
Das Lesen einer Liste von Mustern aus einer Datei ist ebenfalls möglich, erfordert aber für die erforderliche Logik etwas mehr Code.
#!/usr/bin/env zsh
if (( # == 0 )); then
print >&2 "Usage: $0 todofixme ..."
exit 1
fi
globs=(${(f)"$(< patternfile)"})
ret=1
for g in $globs; do
if [[ $1 == $~g ]]; then
ret=0
break
fi
done
if (( ret == 1 )); then
print >&2 "not ok"
exit 1
fi
Und patternfile
dann einige Tests.
% cat patternfile
cat*
*bat
% ./pargchecker fish
not ok
% ./pargchecker catfish
% ./pargchecker wombat
%
Ein Blick auf die Dokumente zshexpn(1)
und zshparam(1)
den vorhandenen Code im $fpath[-1]
Verzeichnis ist wahrscheinlich in Arbeit.