Jak mogę skrócić ten skrypt powłoki?
CODE="A"
if test "$CODE" = "A"
then
PN="com.tencent.ig"
elif test "$CODE" = "a"
then
PN="com.tencent.ig"
elif test "$CODE" = "B"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "b"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "C"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "c"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "D"
then
PN="com.rekoo.pubgm"
elif test "$CODE" = "d"
then
PN="com.rekoo.pubgm"
else
echo -e "\a\t ERROR!"
echo -e "\a\t CODE KOSONG"
echo -e "\a\t MELAKUKAN EXIT OTOMATIS"
exit
fi
shell-script
IISomeOneII
źródło
źródło
bash
kod? Czy masz na myśli jakąś inną powłokę?example.org
,example.net
etc, ponieważ te domeny są zarezerwowane na ten cel w RFC 2606 i nigdy nie zostaną wykorzystane do rzeczywistych podmiotów.Odpowiedzi:
Użyj
case
instrukcji (przenośna, działa w dowolnejsh
powłoce):Polecam również zmianę nazw zmiennych ze wszystkich wielkich liter (jak
CODE
) na małe lub małe litery (jakcode
lubCode
). Istnieje wiele nazw wieloznacznych, które mają specjalne znaczenie, a ponowne użycie jednego z nich przez przypadek może spowodować problemy.Inne uwagi: standardowa konwencja polega na wysyłaniu komunikatów o błędach do „standardowego błędu” zamiast do „standardowego wyjścia”;
>&2
przekierowanie to robi. Ponadto, jeśli skrypt (lub program) zawiedzie, najlepiej wyjść ze stanu niezerowego (exit 1
), aby każdy kontekst wywołujący mógł stwierdzić, co poszło nie tak. Możliwe jest także użycie różnych statusów w celu wskazania różnych problemów ( dobry przykład znajduje się w sekcji „KODY WYJŚCIA” nacurl
stronie podręcznika ). (Podziękowania dla Stéphane Chazelas i Monty Harder za sugestie tutaj.)Polecam
printf
zamiastecho -e
(iecho -n
), ponieważ jest bardziej przenośny między systemami operacyjnymi, wersjami, ustawieniami itp. Kiedyś miałem pęk moich skryptów, ponieważ aktualizacja systemu operacyjnego zawierała wersję bash skompilowaną z różnymi opcjami, które zmieniły sposóbecho
zachowania.Podwójne cudzysłowy
$CODE
nie są tutaj tak naprawdę potrzebne. Ciąg w acase
jest jednym z niewielu kontekstów, w których można je bezpiecznie pominąć. Wolę jednak podwójnie cytować odniesienia do zmiennych, chyba że istnieje konkretny powód, aby tego nie robić, ponieważ trudno jest śledzić, gdzie jest bezpiecznie, a gdzie nie, więc bezpieczniej jest zwyczajnie podwójnie cytować.źródło
*
(i wydrukuje błąd) - wzorzec[aA]
pasuje do „a” lub „A”, ale nie do obu naraz.readonly Exit_BadCode=1
abyexit $Exit_BadCode
zamiast tego mogła powiedzieć .case "${CODE,}" in
, tak że każdy z warunkowych staje się po prostua)
,b)
itd.$CODE
. Zawsze nazywam „status wyjścia” dokładnie tak, nigdy nie „kod”. Jeśli skrypt wymaga użycia setek kluczy w celu odniesienia do ciągów, użyciecase
instrukcji staje się niewygodne.Zakładając, że używasz
bash
wersji 4.0 lub nowszej ...W kodzie definiuję tablicę asocjacyjną zawierającą wszystkie nazwy domen, z których każda jest powiązana z jednym klawiszem z małą literą.
$PN
Zmienna jest przypisana nazwę domeny odpowiadającą dolnym bocznym$CODE
wartości (${CODE,,}
zwraca wartość$CODE
zmieniła się małymi literami tylko) z tej tablicy, ale jeśli$CODE
nie odpowiada ważnego wpisu wdomain
wykazie, to wychodzi skrypt ze związkiem błąd.${variable:?error message}
Podstawienie parametr byłoby rozszerzyć do wartości$variable
(odpowiedniej domeny w kodzie), ale byłoby wyjść skryptu z komunikatem o błędzie, jeśli wartość nie jest pusta dostępny. Nie dostaniesz dokładnie to samo formatowanie komunikatu o błędzie, jak w kodzie, ale to w zasadzie zachowują się tak samo, jeśli$CODE
jest nieprawidłowy:Jeśli zależy Ci na liczbie postaci, możemy to jeszcze skrócić:
Oprócz usuwania niepotrzebnych nowych linii, usunąłem również
com.
z każdej domeny (jest to zamiast tego dodane w przypisaniu doPN
).Zauważ, że cały powyższy kod działałby nawet dla wartości wieloznakowej w
$CODE
(jeśli istniałyby dla nich małe litery wdomain
tablicy).Jeśli
$CODE
zamiast tego byłby indeks numeryczny (zero), to nieco uprościłoby kod:Ułatwi to dodatkowo odczyt
domain
tablicy z pliku pomocniczego zawierającego jeden wpis w wierszu:źródło
declare -A domain
mówi tylko, żedomain
powinna to być zmienna tablicy asocjacyjnej („hash”).$CODE
.$CODE
byłby rozbrojony lub pusty, ale nadal generowałby poprawny niestandardowy komunikat o błędzie.Jeśli twoja powłoka zezwala na tablice, najkrótsza odpowiedź powinna wyglądać następująco:
Zakłada się, że
$code
może to być tylko a, b, c lub d.Jeśli nie, dodaj test:
źródło
${var,}
zamienia na małe litery pierwszego znaku${var}
. @IISomeOneII${var,}
wydaje się jednak być specyficzny dla Bash. Myślę, że tablica asocjacyjna również działałaby w ksh i zshPrzyjmę tę odpowiedź w innym kierunku. Zamiast kodować dane w skrypcie, umieść te dane w osobnym pliku danych, a następnie użyj kodu, aby wyszukać plik:
Rozdzielenie tych obaw ma kilka zalet:
look
do wydajnego wyszukiwania binarnego (zamiast linii po liniigrep
lubawk
)źródło
PN
ustawić poprawną wartość.Używasz liter do indeksowania wartości, jeśli użyjesz liczb, stanie się to tak proste, jak:
To przenośny kod powłoki, będzie działał na większości powłok.
Dla bash można użyć:
pn=${!code}
albo za bash / ksh / zsh użycia:pn=${@:code:1}
.listy
Jeśli musisz użyć liter użytkownika (od a do z lub od A do Z), muszą one zostać przekonwertowane na indeks:
W dłuższym kodzie, aby wyjaśnić intencję i znaczenie każdej części:
Jeśli chcesz przekonwertować na małe litery, użyj:
$(( asciival & ~32 ))
(upewnij się, że bit 6 wartości ascii jest wyłączony).Kod błędu
Dane wyjściowe, które skrypt wyświetla na błędzie, są dość długie (i szczególne).
Najbardziej uniwersalnym sposobem radzenia sobie z tym jest zdefiniowanie funkcji:
A następnie wywołaj tę funkcję z konkretnymi potrzebnymi komunikatami.
Zauważ, że wynikowa wartość wyjścia jest podawana przez
exitcode
(przykład tutaj to 27).Pełny skrypt (z kontrolą błędów) staje się:
źródło