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
j=0; for i do printf "arg#$((j=j+1)) = %s\n" "$i"; done
. Und nein, Sie können nicht++j
alle Muscheln verwenden.Antworten:
Ihr zweites Beispiel benötigt nur einen
#
in der Ausgabezeichenfolge, um die richtige Ausgabe zu generieren, wenn es ausgeführt wirdbash
:Beachten Sie, dass dies im Allgemeinen nicht funktioniert, wenn es mit ausgeführt wird
/bin/sh
, insbesondere nicht, wenn/bin/sh
es sich um eine Shell (wiedash
) handelt, die die((...))
Syntax für die arithmetische Auswertung nicht versteht . Diedash
Shell würde einencnt++: not found
Fehler für den((cnt++))
obigen Code erzeugen, wenn sie versucht, diecnt++
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.bash
eine#!/bin/bash
Zeile oben im Skript verwenden.Für maximale Portabilität würden Sie verwenden
Dies vermeidet zusätzlich Probleme mit Argumenten, die Backslashes enthalten, wenn die
xpg_echo
Shell-Option in aktiviert istbash
, und verwendet POSIX-Syntax zum Inkrementieren des Zählers.quelle
bash
und ich habe es getestet. Wenn Sie das Skript mit ausführen/bin/sh
stattbash
, dann kann es auch nicht wie erwartet funktioniert (/bin/sh
ist nichtbash
auf vielen Systemen). Das zweite Stück Code würde in jedersh
-Shell (einschließlichbash
) funktionieren . In beiden Codes würde die Zählervariable keine spezielle Deklaration innerhalb der Schleife benötigen.