Zugriff auf Bash [intern] Klammererweiterung Iterationsnummer/Variable

Zugriff auf Bash [intern] Klammererweiterung Iterationsnummer/Variable

Frage:

Ist es möglich, darauf zuzugreifen, welche Nummer einer Bash-Iteration aktuell verarbeitet wird?

Pseudo-Kommando

mv {1..5}.something.{1..5} $x1.$x2.something
  • Hinweis: Dies ist eine logische Darstellung; ein nicht funktionierendes Beispiel.

Pseudo-Ausgabe

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
  • Wobei n und m beide die Iteration ihrer jeweiligen Klammererweiterung sind.

Erläuterung

Ich kenne Schleifen wie diese:

for x in {1..10}; do echo -n "$x "; done

Wie Sie sehen, setzt Bash die Iteration auf $x. Ich möchte wissen, ob das möglich ist und wie ich auf die Variable zugreifen kann, die Bash verwendet, wenn ich nicht definiere, welche Variable verwendet werden soll. Wenn Bash eineKlammererweiterungohne eine Variable, über die iteriert werden kann, muss dies irgendwie [intern] geschehen. Ich hoffe, dass diese Variable zur Laufzeit des Skripts zugänglich ist.

Vielen Dank an alle Leute auf#schlagen

Antwort1

Sie verstehen nicht, wie die Klammererweiterung funktioniert. Bitte lesen Sie Dennis Williamsons Kommentar oben noch einmal.

Sie glauben, wenn ich schreibe mv foo.{1,2,3} bar, dass die Shell den Befehl tatsächlich mehrmals aufruft, als ob Sie Folgendes eingegeben hätten:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

Wenn das zutrifft, würde Ihre Frage Sinn ergeben: Die Shell führt mehrere Befehle aus und muss daher eine Liste führen.

Aber das ist nicht der Fall. Die Klammererweiterung erweitertein einziges Argumentruft dann die resultierende Befehlszeile aufeinmal. Im obigen Beispiel sieht die Shell also, dass das Argument foo.{1,2,3}eine Klammererweiterung enthält und erweitert dieses Argument in drei Argumente foo.1 foo.2 foo.3. Dann fügt sie diese Erweiterung anstelle des geschweiften Arguments in die Befehlszeile ein und fährt mit der Analyse der Befehlszeile fort. Wenn dies abgeschlossen ist, führt die Shell einen Befehl aus, der wie folgt aussehen würde:

mv foo.1 foo.2 foo.3 bar

Also ja, wahrscheinlich führt die Shell beim Erweitern dieses geschweiften Arguments eine Liste, aber es gibt keine Möglichkeit, bei der Erweiterung anderer Argumente auf diese Liste zuzugreifen, weil die Erweiterung durch die Klammern vollständig abgeschlossen ist und alle Informationen zur Erweiterung aufgebraucht und vergessen sind, wenn die anderen Argumente analysiert werden.

Ein solches Argument wäre ohnehin nur dann sinnvoll, wenn die Shell mehrere Befehle ausführt, was aber nicht der Fall ist. Um mehrere Befehle auszuführen, müssen Sie eine echte Schleife verwenden. Mit Klammererweiterungen funktioniert das nicht.

Was betrifft $_, das ist eine Perl-Konstruktion, die anstelle einer Schleifenvariable verwendet werden kann (wie xin Ihrem Schleifenbeispiel), also ist die Klammererweiterung nicht wirklich relevant.

Antwort2

Insbesondere mvkönnen Sie einfach die -vFlagge verwenden, um zu sehen, was gerade verarbeitet wird. Wie @DennisWilliamson anmerkte, ist für die durch Klammern erweiterte Sequenz keine Variable festgelegt – Schreiben echo {1..5}ist gleichbedeutend mit Schreiben echo 1 2 3 4 5. Vergleichen Sie mit echo "$foo"– Es gibt im Nachhinein keine Möglichkeit herauszufinden, welche Variable echobearbeitet wurde.

Antwort3

warum verwenden Sie nicht Ihre eigene Variable, um die Iterationsnummer zu zählen und sie auszugeben? Wenn Sie sehen möchten, was bei der Ausführung passiert, führen Sie es mit der Option -x aus. Wie bei Bash sagt Ihnen -x, wo in Ex. Aber ohne anzugeben, was Sie erreichen möchten, ist es schwierig zu helfen.

verwandte Informationen