Zakładając, że używasz bashwersji 4.0 lub nowszej ...
CODE=A
declare -A domain
domain=(
[a]=com.tencent.ig
[b]=com.vng.pubgmobile
[c]=com.pubg.krmobile
[d]=com.rekoo.pubgm
)
PN=${domain[${CODE,,}]:?ERROR! CODE KOSONG, MELAKUKAN EXIT OTOMATIS}
W kodzie definiuję tablicę asocjacyjną zawierającą wszystkie nazwy domen, z których każda jest powiązana z jednym klawiszem z małą literą.
$PNZmienna jest przypisana nazwę domeny odpowiadającą dolnym bocznym $CODEwartości ( ${CODE,,}zwraca wartość $CODEzmieniła się małymi literami tylko) z tej tablicy, ale jeśli $CODEnie odpowiada ważnego wpisu w domainwykazie, 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 $CODEjest nieprawidłowy:
$ bash script.sh
script.sh: line 12: domain[${CODE,,}]: ERROR! CODE KOSONG, MELAKUKAN EXIT OTOMATIS
Jeśli zależy Ci na liczbie postaci, możemy to jeszcze skrócić:
CODE=A
declare -A domain=( [a]=tencent.ig [b]=vng.pubgmobile [c]=pubg.krmobile [d]=rekoo.pubgm )
PN=com.${domain[${CODE,,}]:?ERROR! CODE KOSONG, MELAKUKAN EXIT OTOMATIS}
Oprócz usuwania niepotrzebnych nowych linii, usunąłem również com.z każdej domeny (jest to zamiast tego dodane w przypisaniu do PN).
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 w domaintablicy).
Jeśli $CODEzamiast tego byłby indeks numeryczny (zero), to nieco uprościłoby kod:
CODE=0
domain=( com.tencent.ig com.vng.pubgmobile com.pubg.krmobile com.rekoo.pubgm )
PN=${domain[CODE]:?ERROR! CODE KOSONG, MELAKUKAN EXIT OTOMATIS}
Ułatwi to dodatkowo odczyt domaintablicy z pliku pomocniczego zawierającego jeden wpis w wierszu:
CODE=0
readarray -t domain <domains.txt
PN=${domain[CODE]:?ERROR! CODE KOSONG, MELAKUKAN EXIT OTOMATIS}
bashkod? Czy masz na myśli jakąś inną powłokę?