Wie kann ich dieses Shell-Skript kürzen?
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
quelle
quelle
bash
Code? Oder hast du eine andere Hülle im Sinn?example.org
,example.net
usw., da diese Domänen in RFC 2606 speziell für diesen Zweck reserviert sind und niemals für echte Entitäten verwendet werden.Antworten:
Verwenden Sie eine
case
Anweisung (portabel, funktioniert in einer beliebigensh
Shell):Ich würde auch empfehlen, die Variablennamen von Großbuchstaben (wie
CODE
) in Klein- oder Mischbuchstaben (wiecode
oderCode
) zu ändern . Es gibt viele All-Caps-Namen, die eine besondere Bedeutung haben, und die versehentliche Wiederverwendung eines dieser Namen kann zu Problemen führen.Sonstige Hinweise: Die Standardkonvention besteht darin, Fehlermeldungen an "Standardfehler" und nicht an "Standardausgabe" zu senden. Die
>&2
Umleitung tut dies. Wenn ein Skript (oder Programm) fehlschlägt, beenden Sie das Programm am besten mit einem Status ungleich Null (exit 1
), damit jeder aufrufende Kontext erkennen kann, was schief gelaufen ist. Es ist auch möglich, unterschiedliche Status zu verwenden, um auf unterschiedliche Probleme hinzuweisen ( ein gutes Beispiel finden Sie im Abschnitt "EXIT CODES" auf dercurl
Manpage ). (Dank an Stéphane Chazelas und Monty Harder für Vorschläge hier.)Ich empfehle
printf
anstelle vonecho -e
(undecho -n
), weil es portabler zwischen Betriebssystemen, Versionen, Einstellungen usw. ist. Ich hatte einmal einige Probleme mit meinen Skripten, weil ein Betriebssystem-Update eine Version von bash enthielt, die mit verschiedenen Optionen kompiliert wurde, die dasecho
Verhalten änderten .Die doppelten Anführungszeichen
$CODE
werden hier nicht wirklich benötigt. Die Zeichenfolge in acase
ist einer der wenigen Kontexte, in denen es sicher ist, sie wegzulassen. Ich ziehe es jedoch vor, Variablenreferenzen in doppelte Anführungszeichen zu setzen, es sei denn, es gibt einen bestimmten Grund, dies nicht zu tun, da es schwierig ist, den Überblick darüber zu behalten, wo sie sicher sind und wo nicht.quelle
*
(und gibt den Fehler aus) - das Muster[aA]
stimmt entweder mit "a" oder "A" überein, aber nicht mit beiden gleichzeitig.readonly Exit_BadCode=1
damit erexit $Exit_BadCode
stattdessen sagen kann .case "${CODE,}" in
, so dass jede der Bedingungen einfach wirda)
,b)
etc.$CODE
. Genau das nenne ich immer "Exit Status", niemals nur "Code". Wenn das Skript Hunderte von Schlüsseln verwenden muss , um auf die Zeichenfolgen zu verweisen, wird die Verwendung einercase
Anweisung unhandlich.Angenommen, Sie verwenden
bash
Release 4.0 oder neuer ...Im Code definiere ich ein assoziatives Array, das alle Domänennamen enthält, die jeweils einem einzelnen Kleinbuchstabenschlüssel zugeordnet sind.
Der
$PN
Variablen wird der Domänenname zugewiesen, der dem Wert in Kleinbuchstaben$CODE
entspricht (${CODE,,}
gibt nur den Wert$CODE
in Kleinbuchstaben zurück). Wenn der Name$CODE
jedoch keinem gültigen Eintrag in derdomain
Liste entspricht, wird das Skript mit einem beendet Error.Die
${variable:?error message}
Parametersubstitution würde auf den Wert von$variable
(die entsprechende Domäne im Code) erweitert, das Skript jedoch mit der Fehlermeldung verlassen, wenn der Wert leer ist, nicht verfügbar. Sie erhalten nicht genau die gleiche Formatierung der Fehlermeldung wie in Ihrem Code, sie verhält sich jedoch im Wesentlichen genauso, wenn sie$CODE
ungültig ist:Wenn Sie sich für die Anzahl der Zeichen interessieren, können wir dies weiter verkürzen:
Abgesehen vom Löschen unnötiger Zeilenumbrüche habe ich auch
com.
jede Domain entfernt (dies wird stattdessen in der Zuordnung zu hinzugefügtPN
).Beachten Sie, dass der gesamte obige Code auch für einen aus mehreren Zeichen bestehenden Wert in
$CODE
(sofern für diese imdomain
Array Schlüssel mit geringerem Gehäuse vorhanden sind) funktionieren würde .Wenn
$CODE
es sich stattdessen um einen numerischen (nullbasierten) Index handeln würde, würde dies den Code etwas vereinfachen:Dies würde es zusätzlich sehr einfach machen, das
domain
Array aus einer Hilfsdatei zu lesen, die einen Eintrag pro Zeile enthält:quelle
declare -A domain
sagt nur, dassdomain
dies eine assoziative Arrayvariable ("Hash") sein soll.$CODE
.$CODE
dieser nicht gesetzt oder leer wäre. Danach würde jedoch immer noch die richtige benutzerdefinierte Fehlermeldung generiert.Wenn Ihre Shell Arrays zulässt, sollte die kürzeste Antwort wie folgt lauten:
Das setzt voraus, dass es
$code
sich nur um a, b, c oder d handeln kann.Wenn nicht, fügen Sie einen Test wie folgt hinzu:
quelle
${var,}
konvertiert das erste Zeichen von in Kleinbuchstaben${var}
. @ IISomeOneII${var,}
scheint jedoch Bash-spezifisch zu sein. Ich denke, das assoziative Array würde auch in ksh und zshIch werde diese Antwort in eine andere Richtung nehmen. Anstatt Ihre Daten in das Skript zu codieren, speichern Sie diese Daten in einer separaten Datendatei und durchsuchen Sie die Datei anschließend mit Code:
Das Trennen dieser Bedenken hat einige Vorteile:
look
zur effizienten binären Suche verwenden (anstatt zeilenweisegrep
oderawk
).quelle
PN
, dass der richtige Wert eingestellt wird.Sie verwenden Buchstaben, um die Werte zu indizieren. Wenn Sie Zahlen verwenden, wird dies so einfach wie:
Das ist portabler Shell-Code, der auf den meisten Shells funktioniert.
Für bash können Sie verwenden:
pn=${!code}
oder für bash / KSH / zsh Verwendung:pn=${@:code:1}
.Briefe
Wenn Sie Benutzerbriefe (von A bis Z oder von A bis Z) benötigen, müssen diese in einen Index konvertiert werden:
In einem längeren Code, um die Absicht und Bedeutung jedes Teils zu verdeutlichen:
Wenn Sie in Kleinbuchstaben konvertieren müssen, verwenden Sie:
$(( asciival & ~32 ))
(Stellen Sie sicher, dass Bit 6 des ASCII-Werts nicht gesetzt ist).Fehlercode
Die Ausgabe, die Ihr Skript bei einem Fehler ausgibt, ist ziemlich lang (und speziell).
Der vielseitigste Weg, damit umzugehen, besteht darin, eine Funktion zu definieren:
Rufen Sie dann diese Funktion mit den spezifischen Nachrichten auf, die Sie benötigen.
Beachten Sie, dass der resultierende Exit-Wert durch gegeben ist
exitcode
(Beispiel hier ist 27).Ein vollständiges Skript (mit Fehlerprüfung) wird dann:
quelle