Ja, shift ist nicht sehr gebräuchlich, aber Arrays in der Bash auch nicht. Und wenn man nicht eine der 2 Optionen kennt, dann wird es schwer manche Probleme zu lösen.
Mehr als 9 Parameter hat man selten, aber wenn man sie hat, dann will man das Problem dennoch lösen.
Es sind aber, neben der der Kette von gleichartigen Parametern noch weitere Muster denkbar, wo man mit shift arbeiten könnte:
monotone Parameterliste mit Präfix(en):
a [b ...] x1 x2 x3 ... xn
Beispiele:
mv --Schalter targetdir dat1 dat2 dat3 ... datn
sum 3 4 7 1 2 9 2 9 4 3 4 2 17
product 3 4 7 1 2 9 2 9 4 3 4 2 17
avg 3 4 7 1 2 9 2 9 4 3 4 2 17
stddev 3 4 7 1 2 9 2 9 4 3 4 2 17
eine unbekannte Zahl Gruppen konstanter Länge
a1 b1 a2 b2 ... an bn
a1 b1 c1 a2 b2 c2 ... an bn cn
Beispiele:
mv a1 b1; mv a2 b2; mv a3 b3; ... mv an bn
eine Liste mit besonderer Einleitung und besonderem Ende
Beispiele:
a b ... x1 x2 ... xn
grep a b | egrep -v "(x1|x2|....|xn)"
sql="SELECT a FROM b WHERE x1 AND x2 AND x3 .... AND xn;"
Es ist auch nicht so, dass zwingend der User die Parameter im Kopf haben muss - die Parameter können ja selbst von einem Programm oder Kommando kommen, d.h. der Rechner schaut in ein Verzeichnis, und übergibt alle Dateien an eine Funktion, und die shiftet sich dann durch die Liste.
Und man kann ein usage
raushauen, wenn der User -h als erste Option angibt, wenn er keine angibt, oder wenn eines der Kommandos fehlschlägt; dann muss sich der User die Parameterfolge nicht merken, sondern nur, wie er die Hilfe bekommt.
Ich hatte mal so ein Programm für den Fall, dass ich sehr unscharf suche, und mit Ergebnissen zugemüllt werde, die schlecht sind, und die ich irgendwie filtern muss. Also ich suche beispielsweise nach einer Datei zu Scala, und weiß nicht mehr wie sie hieß.
locate scala
Liefert mir tausende Einträge, also filter ich die class-Dateien aus, weil die, so stelle ich sofort fest, sind es nicht.
locate scala | grep -v class
Dann bleiben immer noch Millionen übrig, die ganzen Hilfedateien in html, Icons ...
locate scala | grep -v class | grep -v html | grep -v png
usw. Das war mir zuviel getipperei, und so löste ich das Problem mit einem Script diskrim.sh, welches shift benutzte, so dass ich
diskrim.sh scala class html png
schreiben konnte. Immer noch zu viel Müll auf dem Screen? PFeil hoch, und "src" hinzugefügt. Dann stellte ich fest, dass man das Ziel leichter mit egrep erreichen kann, also
locate scala | egrep -v "(class|html|png)"
und schrieb mein Script um, welches immer noch mit shift arbeitet, aber ich benutze es kaum noch, weil ich mit 'locate xy' sowieso meist anfange, und dann kann den Filter, den man schrittweise erweitert, auch leicht selbst tippen.
Wie oft kommt es vor, das mit allen Parametern das Gleiche gemacht wird?
Sehr oft, eigentlich immer, man muß nur "allen Parameter" hinreichend definieren. Alle Parameter umfasst ja auch die Sonderfälle 0 und 1 Parameter. Damit sind dann schon 50% der Fälle verarztet. Bei Gruppen definiert man einfach eine Gruppe als einen Paramter, also
1 2 3 4 5 6 | ./make_pictures.sh -datum Datum -zeit Uhrzeit -min Minuten -count Bilder ## ist eigentlich ./make_pictures.sh "(-datum Datum -zeit Uhrzeit -min Minuten -count Bilder)" ## also ein Programm mit einem Parameter und könnte mit mehreren so aussehen: ./make_pictures.sh d1 z1 m1 c1 d2 z2 m2 c2 ... dn zn mn cn ## Und du könntest es n-mal parallel ausführen, zerpflückt von shift. |