Ich versuche, zwei Sequenzen in derselben Schleife in meiner Shell wie folgt zu durchlaufen:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
Irgendeine Idee, wie ich das erreichen kann?
command-line
bash
sh
HISI
quelle
quelle
Antworten:
Dafür brauchen Sie nur eine Klammererweiterung
Wir können eine Liste an
for
( ) übergeben.for i in x y z; do stuff "$i"; done
Hier erhalten geschweifte Klammern
{
}
die Shell, um Ihre Sequenzen zu einer Liste zu erweitern. Sie müssen nur ein Leerzeichen dazwischen setzen, da die Shell Listen mit Argumenten auf diese aufteilt.quelle
echo
die Zahlentouch
Dateien ausführen möchten , können sie dies einfach tuntouch {1..15}.txt {20..25}.txt
, hier wird keine Schleife benötigt. Aber wenn es sich um mehrere Aktionen auf derselben Nummer handelt - OK, könnte dies eine Schleife verwenden.Alternativ können wir verwenden
seq
( eine Folge von Zahlen drucken ), hier sind zwei äquivalente Beispiele:Wenn es sich um ein Skript handelt, können Sie für sich wiederholende Aufgaben folgende Funktionen verwenden:
quelle
Zannas Antwort und die Antwort von pa4080 sind beide gut und ich würde wahrscheinlich unter den meisten Umständen mit einem von ihnen gehen. Vielleicht ist es selbstverständlich, aber der Vollständigkeit halber werde ich es trotzdem sagen: Sie können jeden Wert in ein Array laden und dann das Array durchlaufen. Zum Beispiel:
quelle
Schleifen ohne Schleife
Zannas Antwort ist absolut richtig und gut für Bash geeignet, aber wir können das noch weiter verbessern, ohne eine Schleife zu verwenden.
Das Verhalten von
printf
ist so, dass, wenn die AnzahlARGUMENTS
größer als die Formatsteuerelemente in ist'FORMAT STRING'
,printf
alleARGUMENTS
in gleiche Blöcke aufgeteilt werden und diese immer wieder an die Formatzeichenfolge angepasst werden, bis dieARGUMENTS
Liste leer ist.Wenn wir nach Portabilität streben, können wir
printf "%d\n" $(seq 1 15) $(seq 20 25)
stattdessen verwendenLassen Sie uns das weiter gehen und mehr Spaß machen. Angenommen, wir möchten eine Aktion ausführen, anstatt nur Zahlen zu drucken. Um Dateien aus dieser Zahlenfolge zu erstellen, könnten wir dies leicht tun
touch {1..15}.txt {20..25}.txt
. Was ist, wenn mehrere Dinge auftreten sollen? Wir könnten auch so etwas machen:Oder wenn wir es im Old-School-Stil machen wollen:
Tragbare, aber ausführliche Alternative
Wenn wir eine Skriptlösung erstellen möchten, die mit Shells ohne Klammererweiterung funktioniert (worauf es
{1..15} {20..25}
ankommt), können wir eine einfache while-Schleife schreiben:Natürlich ist diese Lösung ausführlicher, einige Dinge könnten verkürzt werden, aber es funktioniert. Getestet mit
ksh
,dash
,mksh
und natürlichbash
.Bash C-Schlaufe
Aber wenn wir eine Schleife bash-spezifisch machen wollten (aus welchem Grund auch immer, vielleicht nicht nur drucken, sondern auch etwas mit diesen Zahlen machen), können wir dies auch tun (im Grunde C-Loop-Version der tragbaren Lösung):
Oder in besser lesbarem Format:
Leistungsvergleich verschiedener Schleifenansätze
Alternative ohne Shell
Nur weil wir hier die Python-Lösung können
Oder mit etwas Muschel:
quelle
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
dich nicht mal$()
da, nurtouch {1..15}.txt {20..25}.txt
:) Aber natürlich könnten wirprintf "%d\n
{1..15} {20..25} `mit verwenden,xargs
wenn wir mehr als nurtouch
Dateien machen wollen. Es gibt viele Möglichkeiten, Dinge zu tun, und es macht das Schreiben von Skripten so viel Spaß!