Index der Positionsparameter drucken / ausgeben

0

Ich habe diesen funktionierenden und einfachen Code, um die Positionsparameter VALUES wiederzugeben

for i
do
echo "Argument = $i "
done

Hier ist die tatsächliche Ausgabe des Scrips

Argument = --atleast-pkgconfig-version
Argument = 0.9.0

Es macht den Job, aber ich habe versucht herauszufinden, wie man einen Index zur Echoausgabe hinzufügt.

Das funktioniert nicht

cnt=1
for i
do
echo "Argument $cnt = $i "
((cnt++))
done

Der aktuelle Code macht den Job, der Index wäre nur das i-Tüpfelchen - so:

Argument #1 = --atleast-pkgconfig-version
Argument #2 = 0.9.0

Irgendwelche Ideen?

Update Nr. 1

Ich poste dies als Kopie aus dem Texteditor, um das Zeitlimit für die „Bearbeitung in 5 Minuten“ zu umgehen.

Ich habe beide Codes ausgeführt, beide in #! / bin / sh-Skripte. Einer wird direkt im Hauptskript ausgeführt, der zweite im Skript, das vom Hauptskript aus aufgerufen wird - wie angegeben. Beide Codes werden im MAIN-Skript problemlos ausgeführt, aber der erste Code, den ich ursprünglich als problematisch eingestuft habe, wird nicht im sekundären Skript ausgeführt.

Ja, der "portablere" Code behebt das Problem - er wird im gewünschten Skript korrekt ausgeführt. Die ursprüngliche Frage wird immer noch nicht beantwortet - warum schlägt sie mit dem Fehler "Nicht gefunden" fehl.

HAUPT-Skript
--exists glib-2.0                    0
--modversion glib-2.0                2.54.3
--exists --print-errors glib-2.0 >= 2.28    0
First code  - OK 
Argument #1 = dummy
Argument #2 = mt
Second code OK 
Argument #1 = dummy
Argument #2 = mt
Sekundärskript

Erster Code - FAILS

/usr/bin/arm-linux-gnueabihf-pkg-config: 19: /usr/bin/arm-linux-gnueabihf-pkg-config: cnt++: not found
Argument #1 = --print-errors
/usr/bin/arm-linux-gnueabihf-pkg-config: 19: /usr/bin/arm-linux-gnueabihf-pkg-config: cnt++: not found
Argument #1 = glib-2.0 >= 2.28
/usr/bin/a
Zweiter Code - läuft gut
Argument #1 = --exists
Argument #2 = --print-errors
Argument #3 = glib-2.0 >= 2.28
Erster Code
cnt=1
for i do
    echo "Argument #$cnt = $i"
    ((cnt++))
done
Zweiter Code
count=1
for arg do
    printf 'Argument #%d = %s\n' "$count" "$arg"
    count=$(( count + 1 ))
done
Anne
quelle
2
j=0; for i do printf "arg#$((j=j+1)) = %s\n" "$i"; done. Und nein, Sie können nicht ++jalle Muscheln verwenden.
Pizdelect

Antworten:

2

Ihr zweites Beispiel benötigt nur einen #in der Ausgabezeichenfolge, um die richtige Ausgabe zu generieren, wenn es ausgeführt wird bash:

cnt=1
for i do
    echo "Argument #$cnt = $i"
    ((cnt++))
done

Beachten Sie, dass dies im Allgemeinen nicht funktioniert, wenn es mit ausgeführt wird /bin/sh, insbesondere nicht, wenn /bin/shes sich um eine Shell (wie dash) handelt, die die ((...))Syntax für die arithmetische Auswertung nicht versteht . Die dashShell würde einen cnt++: not foundFehler für den ((cnt++))obigen Code erzeugen, wenn sie versucht, die cnt++Zeichenfolge in zwei Sätzen von Sub-Shells auszuführen . Wenn Sie den obigen Code verwenden müssen, stellen Sie sicher, dass er ausgeführt wird, indem Sie z. B. basheine #!/bin/bashZeile oben im Skript verwenden.

Für maximale Portabilität würden Sie verwenden

count=1
for arg do
    printf 'Argument #%d = %s\n' "$count" "$arg"
    count=$(( count + 1 ))
done

Dies vermeidet zusätzlich Probleme mit Argumenten, die Backslashes enthalten, wenn die xpg_echoShell-Option in aktiviert ist bash, und verwendet POSIX-Syntax zum Inkrementieren des Zählers.

Kusalananda
quelle
Leider klappt es zumindest in der Schale nicht.
Anne
Leider klappt es zumindest in der Schale nicht. Ich glaube, das "cnt" ist "außerhalb" der "for" -Schleife definiert, daher "nicht gefunden" in do / done-Code. Vielleicht sollte die "for" -Schleife mit i und cnt als Variablen deklariert werden? Ich vermute, dass bash / shell diese Option nicht hat und ich keinen Pass-Syntaxfehler bekomme.
Anne
@anne Sprichst du über das erste Stück Code in der Antwort speziell? Dieser Code würde funktionieren bashund ich habe es getestet. Wenn Sie das Skript mit ausführen /bin/shstatt bash, dann kann es auch nicht wie erwartet funktioniert ( /bin/shist nicht bashauf vielen Systemen). Das zweite Stück Code würde in jeder sh-Shell (einschließlich bash) funktionieren . In beiden Codes würde die Zählervariable keine spezielle Deklaration innerhalb der Schleife benötigen.
Kusalananda