¿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
bash
código? ¿O tienes algún otro caparazón en mente?example.org
,example.net
etc., 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
case
declaración (portátil, funciona en cualquiersh
tipo 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 (likecode
oCode
). 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
>&2
redirecció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 lacurl
página del manual para ver un buen ejemplo). (Gracias a Stéphane Chazelas y Monty Harder por las sugerencias aquí).Recomiendo en
printf
lugar 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 seecho
comportó.Las comillas dobles
$CODE
no son realmente necesarias aquí. La cadena en acase
es 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=1
para que pueda decir en suexit $Exit_BadCode
lugar.case "${CODE,}" in
modo 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 unacase
declaración se vuelve difícil de manejar.Suponiendo que está utilizando la
bash
versió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
$PN
variable se le asigna el nombre de dominio correspondiente al valor en minúsculas$CODE
(solo${CODE,,}
devuelve el valor$CODE
convertido en letras minúsculas) de esta matriz, pero si$CODE
no corresponde a una entrada válida en ladomain
lista, 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$CODE
no 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 ladomain
matriz).Si
$CODE
se 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
domain
matriz desde un archivo auxiliar que contiene una entrada por línea:fuente
declare -A domain
simplemente dice quedomain
debería ser una variable de matriz asociativa ("hash").$CODE
.$CODE
está 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
$code
solo 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:
look
para buscarlos binariamente de manera eficiente (en lugar de línea por líneagrep
oawk
)fuente
PN
que 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