Szukam operatora „w”, który działa mniej więcej tak:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Jest to oczywiście znacznie krótsze stwierdzenie w porównaniu do, powiedzmy, użycia kilku „lub” testów.
bash
shell-script
bourne-shell
mrjayviper
źródło
źródło
=~
nie jest prawidłowy w teście POSIX pojedynczego nawiasu[
jest POSIX, ale[[
jest rozszerzoną funkcją bash, ksh (najwyraźniej pochodzi z tego miejsca, a zsh.case
przykład jest najbardziej POSIX ze wszystkichcase "$1" in
nie musi być cytowany, żadne dzielenie słów ani interpretacja nazw ścieżek nie są wykonywane w tym tokenie.Nie ma testu „w” w bash, ale istnieje test wyrażenia regularnego (nie w bourne):
I zwykle napisane przy użyciu zmiennej (mniej problemów z cytowaniem):
W przypadku starszej powłoki Bourne'a należy użyć dopasowania wielkości liter:
źródło
Używanie a
case
jest w porządku i dobrze, jeśli masz ustalony zestaw zwierząt, z którymi chcesz się równać. Ale to nie zadziała, jeśli trzeba zbudować wzorzec w środowisku wykonawczym, ponieważcase
nie interpretuje on naprzemienności z rozszerzonych parametrów.Spowoduje to dopasowanie tylko literału
cat|dog|mouse
:Możesz jednak użyć zmiennej z dopasowaniem wyrażenia regularnego. Dopóki zmienna nie jest cytowana, wszystkie operatory wyrażenia regularnego w niej zawarte mają swoje specjalne znaczenie.
Możesz także użyć tablic asocjacyjnych. Sprawdzenie, czy klucz istnieje w jednym, jest najbliższe
in
operatorowi, który daje Bash. Chociaż składnia jest nieco brzydka:(
${arr[$1]+x}
rozwija się dox
ifarr[$1]
jest ustawione, w przeciwnym razie puste ).źródło
Ty mógł używać
case
oświadczenie wif
teście, ale kod będzie wyglądać nieco niebezpieczny:lub nieco krótszy,
To jest użycie
case
klauzuli tylko w celu dopasowania wzorca dlaif
klauzuli. Wprowadza niepotrzebny test prawda / fałsz.Lepiej po prostu użyć
case
:Nie rób tego:
albo to:
... ponieważ dodajesz bardziej niebezpieczny cruft, aby móc użyć
if
instrukcji w kodzie zamiast całkowicie rozsądnejcase
instrukcji.źródło
eval
zecase
stwierdzeń i byłby jeszcze bardziej podatny na błędy."$1"|"$2"|"$3"
. Również unix.stackexchange.com/a/234415/85039 Ale tak, to trochę owłosione.grep
podejście.-q
aby uniknąć wyświetlania danych wyjściowych (szybsze pisanie niż>/dev/null
).-E
(cat|dog|mouse)
wymagają tego aspekty rozszerzonych wyrażeń regularnych .^(cat|dog|mouse)$
dopasowuje dowolne linie zaczynające się (^
) od kota, psa lub myszy ((cat|dog|mouse)
), a następnie koniec linii ($
)źródło