Como posso encurtar este script de shell?
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
Use uma
case
declaração (portátil, funciona em qualquersh
shell):Eu também recomendaria alterar seus nomes de variáveis de todas as letras maiúsculas (como
CODE
) para algo em minúsculas ou mistas (comocode
ouCode
). Existem muitos nomes em maiúsculas que têm significados especiais, e reutilizar um deles por acidente pode causar problemas.Outras notas: A convenção padrão é enviar mensagens de erro para "erro padrão" em vez de "saída padrão"; o
>&2
redirecionamento faz isso. Além disso, se um script (ou programa) falhar, é melhor sair com um status diferente de zero (exit 1
), para que qualquer contexto de chamada possa dizer o que deu errado. Também é possível usar diferentes status para indicar problemas diferentes (veja a seção "EXIT CODES" da páginacurl
man para um bom exemplo). (Crédito a Stéphane Chazelas e Monty Harder para sugestões aqui.)Eu recomendo
printf
em vez deecho -e
(eecho -n
), porque é mais portátil entre sistemas operacionais, versões, configurações, etc. Certa vez tive vários scripts quebrados porque uma atualização do sistema operacional incluiu uma versão do bash compilada com opções diferentes, o que mudou oecho
comportamento.As aspas duplas
$CODE
não são realmente necessárias aqui. A string em acase
é um dos poucos contextos em que é seguro deixá-los de fora. No entanto, prefiro aspas duplas de referências de variáveis, a menos que haja uma razão específica para não fazê-lo, porque é difícil acompanhar onde é seguro e onde não é, por isso é mais seguro apenas aspas duplas habitualmente.Supondo que você esteja usando a
bash
versão 4.0 ou mais recente...No código, defino uma matriz associativa contendo todos os nomes de domínio, cada um associado a uma única letra minúscula.
A
$PN
variável recebe o nome de domínio correspondente ao$CODE
valor em minúsculas (${CODE,,}
retorna$CODE
apenas o valor de transformado em letras minúsculas) desta matriz, mas se$CODE
não corresponder a uma entrada válida nadomain
lista, ela sai do script com um erro.A
${variable:?error message}
substituição do parâmetro seria expandida para o valor de$variable
(o domínio apropriado no código), mas sairia do script com a mensagem de erro se o valor estiver vazio e não estiver disponível. Você não obtém exatamente a mesma formatação da mensagem de erro que em seu código, mas essencialmente se comportaria da mesma forma se$CODE
fosse inválido:Se você se preocupa com a contagem de caracteres, podemos encurtar ainda mais:
Além de excluir novas linhas desnecessárias, também removi
com.
de cada domínio (isso é adicionado na atribuição aPN
).Observe que todo o código acima funcionaria mesmo para um valor de vários caracteres
$CODE
(se existissem chaves minúsculas para eles nadomain
matriz).Se
$CODE
fosse um índice numérico (baseado em zero), isso simplificaria um pouco o código:Isso também tornaria muito fácil ler a
domain
matriz de um arquivo auxiliar contendo uma entrada por linha:Se o seu shell permitir arrays, a resposta mais curta deve ser como este exemplo no bash:
Isso supondo que
$code
só poderia ser a, b, c ou d.Se não, adicione um teste como:
Vou levar esta resposta em uma direção diferente. Em vez de codificar seus dados no script, coloque esses dados em um arquivo de dados separado e use o código para pesquisar o arquivo:
Separar essas preocupações tem alguns benefícios:
look
-la para pesquisá-la com eficiência binária (em vez de linha por linhagrep
ouawk
)Você está usando letras para indexar os valores, se você usar números, fica tão simples quanto:
Esse é o código shell portátil, funcionará na maioria dos shells.
Para bash você pode usar:
pn=${!code}
, ou para bash/ksh/zsh use:pn=${@:code:1}
.cartas
Se você precisar usar letras (de a a z ou A a Z), elas devem ser convertidas em um índice:
Em um código mais longo para esclarecer a intenção e o significado de cada parte:
Se você precisar converter para valores minúsculos, use:
$(( asciival & ~32 ))
(certifique-se de que o bit 6 do valor ascii esteja desabilitado).Erro de código
A saída que seu script imprime em um erro é bastante longa (e particular).
A maneira mais versátil de lidar com isso é definir uma função:
E então chame essa função com a(s) mensagem(ns) específica(s) que você precisa.
Observe que o valor de saída resultante é dado por
exitcode
(exemplo aqui é 27).Um script completo (com verificação de erros) se torna: