¿Cómo puedo acortar 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
shell-script
IISomeOneII
fuente
fuente

bashcódigo? ¿O tienes algún otro caparazón en mente?example.org,example.netetc., ya que estos dominios están específicamente reservados para este propósito en RFC 2606 y nunca se utilizarán para entidades reales.Respuestas:
Use una
casedeclaración (portátil, funciona en cualquiershtipo de shell):También recomendaría cambiar los nombres de las variables de todas las letras mayúsculas (like
CODE) a algo en minúsculas o mixtas (likecodeoCode). Hay muchos nombres en mayúsculas que tienen significados especiales, y reutilizar uno de ellos por accidente puede causar problemas.Otras notas: La convención estándar es enviar mensajes de error a "error estándar" en lugar de "salida estándar"; la
>&2redirección hace esto. Además, si falla un script (o programa), es mejor salir con un estado distinto de cero (exit 1), de modo que cualquier contexto de llamada pueda decir qué salió mal. También es posible utilizar diferentes estados para indicar diferentes problemas (consulte la sección "CÓDIGOS DE SALIDA" de lacurlpágina del manual para ver un buen ejemplo). (Gracias a Stéphane Chazelas y Monty Harder por las sugerencias aquí).Recomiendo en
printflugar deecho -e(yecho -n), porque es más portátil entre sistemas operativos, versiones, configuraciones, etc. Una vez tuve una interrupción de mis scripts porque una actualización del sistema operativo incluía una versión de bash compilada con diferentes opciones, lo que cambió la forma en que seechocomportó.Las comillas dobles
$CODEno son realmente necesarias aquí. La cadena en acasees uno de los pocos contextos donde es seguro dejarlos fuera. Sin embargo, prefiero citar las referencias de variables a menos que haya una razón específica para no hacerlo, porque es difícil hacer un seguimiento de dónde es seguro y dónde no, por lo que es más seguro citarlas habitualmente.fuente
*(e imprimirá el error): el patrón[aA]coincide con "a" o "A", pero no con ambos a la vez.readonly Exit_BadCode=1para que pueda decir en suexit $Exit_BadCodelugar.case "${CODE,}" inmodo que cada uno de los condicionales se vuelva simplea),b)etc.$CODE. Siempre llamo "estado de salida" exactamente eso, nunca solo "código". Si el script necesita usar cientos de claves para referirse a las cadenas, el uso de unacasedeclaración se vuelve difícil de manejar.Suponiendo que está utilizando la
bashversión 4.0 o posterior ...En el código, defino una matriz asociativa que contiene todos los nombres de dominio, cada uno asociado con una sola letra minúscula.
A la
$PNvariable se le asigna el nombre de dominio correspondiente al valor en minúsculas$CODE(solo${CODE,,}devuelve el valor$CODEconvertido en letras minúsculas) de esta matriz, pero si$CODEno corresponde a una entrada válida en ladomainlista, sale del script con un error.La
${variable:?error message}sustitución de parámetros se expandiría al valor de$variable(el dominio apropiado en el código) pero saldría del script con el mensaje de error si el valor está vacío no disponible. No obtiene exactamente el mismo formato del mensaje de error que en su código, pero esencialmente se comportaría igual si$CODEno es válido:Si te importa el recuento de personajes, podemos acortar esto aún más:
Además de eliminar nuevas líneas innecesarias, también he eliminado
com.de cada dominio (esto se agrega en la asignación aPN).Tenga en cuenta que todo el código anterior funcionaría incluso para un valor de varios caracteres en
$CODE(si existieran claves en minúsculas para estos en ladomainmatriz).Si
$CODEse tratara de un índice numérico (basado en cero), esto simplificaría un poco el código:Esto también facilitaría la lectura de la
domainmatriz desde un archivo auxiliar que contiene una entrada por línea:fuente
declare -A domainsimplemente dice quedomaindebería ser una variable de matriz asociativa ("hash").$CODE.$CODEestá configurado o está vacío, pero aún así generaría el mensaje de error personalizado correcto después de eso.Si su shell permite matrices, la respuesta más corta debería ser como este ejemplo en bash:
Eso es asumiendo que
$codesolo podría ser a, b, c o d.Si no, agregue una prueba como:
fuente
${var,}convierte a minúscula el primer carácter de${var}. @IISomeOneII${var,}Sin embargo, parece ser específico de Bash. Creo que la matriz asociativa también funcionaría en ksh y zshVoy a tomar esta respuesta en una dirección diferente. En lugar de codificar sus datos en el script, coloque esos datos en un archivo de datos separado, luego use el código para buscar el archivo:
Separar estas preocupaciones tiene algunos beneficios:
lookpara buscarlos binariamente de manera eficiente (en lugar de línea por líneagrepoawk)fuente
PNque se establezca en el valor correcto.Está usando letras para indexar los valores, si usara números, se vuelve tan simple como:
Ese es el código de shell portátil, funcionará en la mayoría de los shells.
Para fiesta puede usar:
pn=${!code}o para bash / ksh / zsh uso:pn=${@:code:1}.letras
Si debe usar letras de usuario (de la A a la Z o de la A a la Z), deben convertirse en un índice:
En un código más largo para aclarar la intención y el significado de cada parte:
Si necesita convertir a valores en minúscula, use:
$(( asciival & ~32 ))(asegúrese de que el bit 6 del valor ascii no esté establecido).código de error
El resultado que su script imprime en un error es bastante largo (y particular).
La forma más versátil de manejarlo es definir una función:
Y luego llame a esa función con los mensajes específicos que necesita.
Tenga en cuenta que el valor de salida resultante viene dado por
exitcode(el ejemplo aquí es 27).Un script completo (con comprobación de errores) se convierte en:
fuente