Comment puis-je raccourcir ce script 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
la source
la source
bash
code? Ou avez-vous un autre obus en tête?example.org
,example.net
etc., car ces domaines sont spécifiquement réservés à cet effet dans la RFC 2606 et ne seront jamais utilisés pour des entités réelles.Réponses:
Utilisez une
case
instruction (portable, fonctionne dans n'importe quelsh
shell):Je recommanderais également de changer vos noms de variable de toutes les lettres majuscules (comme
CODE
) en quelque chose en minuscule ou en majuscules (commecode
ouCode
). Il existe de nombreux noms tout en majuscules qui ont des significations spéciales, et la réutilisation de l'un d'eux par accident peut causer des problèmes.Autres remarques: La convention standard consiste à envoyer des messages d'erreur à "erreur standard" plutôt qu'à "sortie standard"; la
>&2
redirection fait cela. De plus, si un script (ou un programme) échoue, il est préférable de quitter avec un état différent de zéro (exit 1
), afin que tout contexte d'appel puisse dire ce qui s'est mal passé. Il est également possible d'utiliser différents statuts pour indiquer différents problèmes (voir la section "CODES DE SORTIE" de lacurl
page de manuel pour un bon exemple). (Nous remercions Stéphane Chazelas et Monty Harder pour leurs suggestions ici.)Je recommande
printf
au lieu deecho -e
(etecho -n
), car il est plus portable entre les systèmes d'exploitation, les versions, les paramètres, etc. J'ai eu une fois un tas de mes scripts interrompus, car une mise à jour du système d'exploitation comprenait une version de bash compilée avec différentes options, ce qui a changé la façon dontecho
se comportait.Les guillemets autour
$CODE
ne sont pas vraiment nécessaires ici. La chaîne dans acase
est l'un des rares contextes où il est sûr de les laisser de côté. Cependant, je préfère citer les références de variable entre guillemets à moins qu'il n'y ait une raison spécifique de ne pas le faire, car il est difficile de savoir où il est sûr et où il ne l'est pas, il est donc plus sûr de simplement les citer entre deux.la source
*
(et affichera l'erreur) - le motif[aA]
correspond à "a" ou "A", mais pas aux deux à la fois.readonly Exit_BadCode=1
afin qu'il puisse dire à laexit $Exit_BadCode
place.case "${CODE,}" in
, de sorte que chacune des conditions devienne simplementa)
,b)
etc.$CODE
. J'appelle toujours "statut de sortie" exactement cela, jamais seulement "code". Si le script doit utiliser plusieurs centaines de clés pour faire référence aux chaînes, l'utilisation d'unecase
instruction devient compliquée.En supposant que vous utilisez la
bash
version 4.0 ou plus récente ...Dans le code, je définis un tableau associatif contenant tous les noms de domaine, chacun associé à une clé minuscule à une seule lettre.
La
$PN
variable se voit attribuer le nom de domaine correspondant à la$CODE
valeur en minuscules (${CODE,,}
renvoie la valeur de$CODE
transformée en lettres minuscules uniquement) à partir de ce tableau, mais si le$CODE
ne correspond pas à une entrée valide dans ladomain
liste, il quitte le script avec un Erreur.La
${variable:?error message}
substitution de paramètres s'étendrait à la valeur de$variable
(le domaine approprié dans le code) mais quitterait le script avec le message d'erreur si la valeur est vide non disponible. Vous n'obtenez pas exactement le même formatage du message d'erreur que dans votre code, mais il se comporterait essentiellement de la même manière s'il$CODE
n'est pas valide:Si vous vous souciez du nombre de caractères, nous pouvons le raccourcir davantage:
Outre la suppression des sauts de ligne inutiles, j'ai également supprimé
com.
de chaque domaine (cela est ajouté à la place dans l'affectation àPN
).Notez que tout le code ci-dessus fonctionnerait même pour une valeur à plusieurs caractères dans
$CODE
(si des clés en bas de casse existaient pour celles-ci dans ledomain
tableau).Si
$CODE
c'était un index numérique (basé sur zéro) à la place, cela simplifierait un peu le code:De plus, cela faciliterait la lecture du
domain
tableau à partir d'un fichier auxiliaire contenant une entrée par ligne:la source
declare -A domain
dit simplement que celadomain
devrait être une variable de tableau associatif ("hachage").$CODE
.$CODE
n'était pas défini ou vide, mais il générerait toujours le message d'erreur personnalisé correct après cela.Si votre shell autorise les tableaux, la réponse la plus courte devrait être comme cet exemple dans bash:
Cela suppose que cela
$code
ne peut être que a, b, c ou d.Sinon, ajoutez un test comme:
la source
${var,}
convertit en minuscules le premier caractère de${var}
. @IISomeOneII${var,}
semble être spécifique à Bash. Je pense que le tableau associatif fonctionnerait aussi dans ksh et zshJe vais prendre cette réponse dans une direction différente. Plutôt que de coder vos données dans le script, placez ces données dans un fichier de données séparé, puis utilisez le code pour rechercher le fichier:
La séparation de ces préoccupations présente quelques avantages:
look
pour effectuer des recherches binaires efficaces (plutôt que ligne par lignegrep
ouawk
)la source
PN
la valeur correcte soit définie.Vous utilisez des lettres pour indexer les valeurs, si vous utilisiez des nombres, cela devient aussi simple que:
C'est un code shell portable qui fonctionnera sur la plupart des shells.
Pour bash vous pouvez utiliser:
pn=${!code}
ou pour une utilisation bash / ksh / zsh:pn=${@:code:1}
.des lettres
Si vous devez utiliser des lettres (de a à z ou de A à Z), elles doivent être converties en index:
Dans un code plus long pour clarifier l'intention et la signification de chaque partie:
Si vous devez convertir des valeurs en minuscules, utilisez:
$(( asciival & ~32 ))
(assurez-vous que le bit 6 de la valeur ascii n'est pas défini).code d'erreur
La sortie que votre script imprime sur une erreur est assez longue (et particulière).
La façon la plus polyvalente de la gérer est de définir une fonction:
Ensuite, appelez cette fonction avec le ou les messages spécifiques dont vous avez besoin.
Notez que la valeur de sortie résultante est donnée par
exitcode
(l'exemple ici est 27).Un script complet (avec vérification d'erreur) devient alors:
la source