Como posso encurtar esse 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
shell-script
IISomeOneII
fonte
fonte
bash
código? Ou você tem alguma outra concha em mente?example.org
,example.net
etc, pois esses domínios são reservados especificamente para esse fim na RFC 2606 e nunca serão usados para entidades reais.Respostas:
Use uma
case
declaração (portátil, funciona em qualquersh
shell semelhante):Também recomendo alterar os nomes das variáveis de todas as letras maiúsculas (como
CODE
) para algo em letras minúsculas ou mistas (comocode
ouCode
). Existem muitos nomes em maiúsculas com significados especiais e a reutilização de 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 diferentes problemas (consulte a secção "códigos de saída" dacurl
página do homem para um bom exemplo). (Agradecemos a Stéphane Chazelas e Monty Harder pelas sugestões aqui.)Eu recomendo, em
printf
vez deecho -e
(eecho -n
), porque é mais portátil entre sistemas operacionais, versões, configurações, etc. Certa vez, tive um monte de scripts quebrados porque uma atualização do sistema operacional incluía uma versão do bash compilada com opções diferentes, que mudavam 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 fora. No entanto, prefiro citar duas vezes as referências de variável, a menos que haja um motivo específico para não fazê-lo, porque é difícil acompanhar onde é seguro e onde não é, por isso é mais seguro citá-las habitualmente.fonte
*
(e imprimirá o erro) - o padrão[aA]
corresponde a "a" ou "A", mas não os dois ao mesmo tempo.readonly Exit_BadCode=1
para que possa dizer emexit $Exit_BadCode
vez disso.case "${CODE,}" in
, de modo que cada uma das condicionais torna-se simplesmentea)
,b)
etc.$CODE
. Eu sempre chamo "status de saída" exatamente isso, nunca apenas "código". Se o script precisar usar muitas centenas de chaves para se referir às strings, o uso de umacase
instrução se tornará difícil.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 é atribuído o nome de domínio correspondente ao encaixotado menor$CODE
valor (${CODE,,}
retorna o valor de$CODE
se transformou em letras minúsculas apenas) a partir desta matriz, mas se a$CODE
não corresponder a uma entrada válida nadomain
lista, ele 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 não estiver disponível. Você não recebe exatamente a mesma formatação da mensagem de erro que no seu código, mas ela essencialmente se comportaria da mesma forma se$CODE
for inválida:Se você se importa com a contagem de caracteres, podemos reduzir ainda mais isso:
Além de excluir novas linhas desnecessárias, também removi
com.
de cada domínio (isso foi adicionado na atribuição aPN
).Observe que todo o código acima funcionaria mesmo para um valor de vários caracteres
$CODE
(se existirem chaves de caixa baixa para elas nadomain
matriz).Se
$CODE
fosse um índice numérico (baseado em zero), isso simplificaria um pouco o código:Além disso, seria muito fácil ler a
domain
matriz de um arquivo auxiliar contendo uma entrada por linha:fonte
declare -A domain
apenas diz quedomain
deve ser uma variável de matriz associativa ("hash").$CODE
.$CODE
não estivesse definido ou vazio, mas ainda assim geraria a mensagem de erro personalizada correta depois disso.Se seu shell permitir matrizes, a resposta mais curta deve ser como este exemplo no bash:
Isso pressupõe que
$code
só poderia ser a, b, c ou d.Caso contrário, adicione um teste como:
fonte
${var,}
convertida em minúscula o primeiro caractere de${var}
. @IISomeOneII${var,}
parece ser específico do Bash. Eu acho que a matriz associativa também funcionaria no ksh e no zshVou levar esta resposta para 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 no arquivo:
A separação dessas preocupações traz alguns benefícios:
look
-los para pesquisar com eficiência os binários (em vez de linha por linhagrep
ouawk
)fonte
PN
o valor correto.Você está usando letras para indexar os valores; se você usar números, torna-se tão simples quanto:
Esse código shell portátil funciona na maioria dos shells.
Para a festança você pode usar:
pn=${!code}
ou para bash / ksh / uso zsh:pn=${@:code:1}
.cartas
Se você precisar usar letras (de a a z ou A a Z), elas deverão 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 em minúsculas, use:
$(( asciival & ~32 ))
(verifique se o bit 6 do valor ascii está desativado).Erro de código
A saída que seu script imprime com um erro é bastante longa (e específica).
A maneira mais versátil de lidar com isso é definir uma função:
E, em seguida, chame essa função com as mensagens específicas necessárias.
Observe que o valor de saída resultante é fornecido por
exitcode
(exemplo aqui é 27).Um script completo (com verificação de erro) se torna:
fonte