Ich stecke ein bisschen fest. Meine Aufgabe ist es, die Argumente für mein Skript in umgekehrter Reihenfolge zu drucken, mit Ausnahme der dritten und vierten.
Was ich habe, ist dieser Code:
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
Da ich eval hasse (Grüße an PHP), suche ich nach einer Lösung ohne diese, kann aber keine finden.
Wie kann ich die Position des Arguments dynamisch definieren?
PS: Nein, es ist keine Hausaufgabe, ich lerne gerade die Shell für eine Prüfung, also versuche ich, alte Prüfungen zu lösen.
quelle
arg
da sie korrekt und nicht umgekehrt bestellt sind. Für die Verwendung vonexpr
bin ich nur auf die Verwendung des Standards beschränkt.#!/bin/bash
, können Sie${!i}
und verwenden(())
. Wenn Sie sich an Standard- sh halten möchten , sind diese nicht verfügbar, sind es aber$((…))
.eval
ist nicht der einzige tragbare Weg, wie Ryan gezeigt hat .Ich behalte ein Skript
reverse
auf meinem Weg, das dies tut:Beispielverwendung:
Sie können auch eine Funktion anstelle eines dedizierten Skripts verwenden.
quelle
$#
? Kann es etwas anderes als eine nicht negative ganze Zahl sein?local arg=$1
Dies ist eine korrekte und ungefährliche Verwendung von eval. Sie haben die volle Kontrolle über den Inhalt, den Sie gerade haben
eval
.Wenn Sie immer noch schlechte Gefühle verspüren, können Sie die
${!i}
Indirektionssyntax von Bash verwenden, wenn Sie sich nicht für Portabilität interessieren .quelle
${!i}
das nicht Teil der Standardsyntax?Vorausgesetzt, die Positionsparameter enthalten keine Zeilenumbrüche:
Prüfung:
Testausgang:
quelle
Mit
zsh
:Oa
ist ein Parametererweiterungsflag zum Sortieren der Arrayelemente bei der Erweiterung in umgekehrte Arrayindizes.3 und 4 ausschließen:
quelle
Mit grundsätzlich jeder Shell:
Und Sie nicht brauchen , verwenden Subshells. Beispielsweise:
... druckt ...
Und hier ist eine Shell-Funktion, mit der Sie eine Shell festlegen können
alias
, die die Argumente vorwärts oder rückwärts ausgibt:Es wird nicht versucht, die Literalwerte für Argumente zu speichern, sondern es wird eine Zeichenfolge wie die folgende in das
args
alias
folgende Feld eingefügt :... und speichert so nur Verweise auf die Parameter vor und zurück. Es wird bis zu einer Anzahl gespeichert, die als Argument angegeben wird. Und so wurde das oben
alias
Genannte wie folgt generiert:printf
Das Verhalten von wird basierend auf dem Rückgabewert des vorherigen Befehls beeinflusst - der immer:
der Null-Befehl ist und daher normalerweise wahr ist.printf
Bei jedem Ausdruck wird die Hälfte der Argumente übersprungen. Standardmäßig werden die Argumente von klein nach groß gedruckt. Wenn Sie jedoch nur Folgendes tun:... es druckt sie umgekehrt.
Da der Alias keine Literalwerte speichert, bleibt sein Wert statisch, während sich die tatsächlichen Argumente ändern, er verweist jedoch weiterhin auf so viele wie möglich. Beispielsweise:
... was druckt ...
Das Zurücksetzen des Alias kann folgendermaßen erfolgen:
... und so druckt es ...
quelle
quelle
for ((i = $# - 1; i >= 0; i--))