Próbowałem sprawdzić, czy PHONE_TYPE
zmienna zawiera jedną z trzech prawidłowych wartości.
if [ "$PHONE_TYPE" != "NORTEL" ] || [ "$PHONE_TYPE" != "NEC" ] ||
[ "$PHONE_TYPE" != "CISCO" ]
then
echo "Phone type must be nortel,cisco or nec"
exit
fi
Powyższy kod nie działał dla mnie, więc zamiast tego spróbowałem:
if [ "$PHONE_TYPE" == "NORTEL" ] || [ "$PHONE_TYPE" == "NEC" ] ||
[ "$PHONE_TYPE" == "CISCO" ]
then
: # do nothing
else
echo "Phone type must be nortel,cisco or nec"
exit
fi
Czy istnieją czystsze sposoby wykonywania tego typu zadań?
shell-script
shell
Munish
źródło
źródło
if [[ ! $PHONE_TYPE =~ ^(NORTEL|NEC|CISCO)$ ]]; then
Dobre odpowiedzi i bezcenna lekcja;) Chcę tylko uzupełnić notatką.
Wybór testu zależy w dużym stopniu od kodu, struktury, otoczenia itp.
Alternatywą może być użycie przełącznika lub
case
instrukcji jak w:Jako drugą uwagę należy zachować ostrożność, używając nazw zmiennych pisanych dużymi literami. Ma to na celu uniknięcie kolizji między zmiennymi wprowadzanymi przez system, które prawie zawsze są wielkimi literami. Dlatego
$phone_type
zamiast$PHONE_TYPE
.Chociaż ten jest bezpieczny, jeśli masz nawyk używania wielkich liter, pewnego dnia możesz powiedzieć
IFS="boo"
i jesteś w świecie bólu.Ułatwi również dostrzeżenie, co jest tym.
Nie trzeba, ale zdecydowanie powinien rozważyć.
Przypuszczalnie jest to również dobry kandydat na funkcję. To głównie sprawia, że kod jest łatwiejszy do odczytania i utrzymania. Na przykład:
źródło
Powinieneś używać AND, a nie OR.
lub
źródło
Aby poprawić powyższą odpowiedź (ponieważ nie mogę jeszcze komentować):
Pamiętaj, że potrzebujesz przynajmniej bash 4 do tego użycia = ~
Nie działa w bash 3.
Testowałem na MS Windows 7 używając bash 4.3.46 (działa dobrze) i bash 3.1.17 (nie działał)
LHS = = powinno być w cudzysłowach. Powyżej PHONE_TYPE = „SPACE TEL” również pasowałby.
źródło
Użyj [[zamiast
źródło
[[
vs[
nie pomaga przy wyłączonej logice.Tylko propozycja zmiany oparta na rozwiązaniu @ 0x80:
źródło