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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.