staging.inyokaproject.org

Shell/Bash-Skripting-Guide für Anfänger

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Shell/Bash-Skripting-Guide_für_Anfänger.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

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. 

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Kommandozeilen-Parameter mit unterschiedlicher Anzahl von Argumenten auswerten:

Skript nimmt einen Parameter -v ohne Argumente, -a mit einem Argument, -b mit zwei Argumenten, also z.B.

1
2
3
./skript -v -a 1
./skript -b 6 4 
./skript -b 6 4 -a 4 -v
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

verbose=0
a=1
b1=10
b2=20

while [ $# -gt 0 ]; do
    case $1 in
	-v) verbose=1;;
	-a) a=$2; shift;;
	-b) b1=$2; b2=$3; shift;shift;;
    esac
    shift
done

echo "$verbose"
echo "$a"
echo $b1 $b2

In der Praxis will man da natürlich noch ein bisschen Fehlerbehandlung...

kaputtnik

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9245

Es soll doch nur erklärt werden, was shift macht.

user unknown schrieb:

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.

Stimmt. Ich habe einfach zu wenig Erfahrung um Mitreden zu können 😕

cornix Team-Icon

Avatar von cornix

Anmeldungsdatum:
9. März 2007

Beiträge: 4763

kaputtnik schrieb:

Es soll doch nur erklärt werden, was shift macht.

Und das ist nichts besonderes: es schickt nur $1 ins nir Nirvana und setzt alle weiteren Parameter runter, sprich $2 wird $1 usw. Optinal mit Schrittweite n.

Zur ausgeklügelten Auswertung nimmt man vermutlich getopts.

Da zeigt sich IMHO, dass es besser wäre erst die Referenz zu den Befehlen und Builtins und dann den Guide zu schreiben. Da ich aber die Zeit und Lust dazu nie gefunden habe, steht es mir eigentlich auch nicht zu, darüber zu meckern. 😉

Gruß, cornix

frustschieber Team-Icon

Ehemalige
Avatar von frustschieber

Anmeldungsdatum:
4. Januar 2007

Beiträge: 4259

2 Verbesserungsvorschläge:

(1) "Man kann das Skript, nachdem es ausführbar gemacht wurde, in einen Ordner (z.B. ~/bin) verlinken oder verschieben, welchen man der Umgebungsvariablen $PATH bekannt macht. Dies ist vor allem dann sinnvoll, wenn ein fertiges Skript von überall her einfach durch die Eingabe des Skriptnamens aufrufbar sein soll." Zum besseren Verständnis sollte da ein Hinweis auf entsprechende Wikiartikel zu "Verlinken" und "mit Path bekanntmachen" rein.

(2) Im Wiki finden sich immer wieder Skripte erwähnt, die Einem Arbeit erleichtern sollen. Wäre es möglich, für diese Anwendung kurz auch in das Bash-skripting aufzunehmen, wie genau man einen solchen Eintrag nutzen kann?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

frustschieber schrieb:

(2) Im Wiki finden sich immer wieder Skripte erwähnt, die Einem Arbeit erleichtern sollen. Wäre es möglich, für diese Anwendung kurz auch in das Bash-skripting aufzunehmen, wie genau man einen solchen Eintrag nutzen kann?

  • 'Diese Anwendung' - welche Anwendung?

  • Was für einen Eintrag soll man wo wie nutzen? In das Bash-Skripting aufzunehmen?

Ich verstehe nur Bahnhof.

frustschieber Team-Icon

Ehemalige
Avatar von frustschieber

Anmeldungsdatum:
4. Januar 2007

Beiträge: 4259

Beispiel http://wiki.ubuntuusers.de/Steghide#Stapelverarbeitung Es wird ein Skript erwähnt, das nützlich scheint. Wie krieg ich das auf meinen Rechner? Wie Schritt-für-Schritt kommt das zum Laufen? Für diese Frage würde ich im Bash-Skripting-Guide_für_Anfänger z.B. suchen.

user unknown schrieb:

frustschieber schrieb: Ich verstehe nur Bahnhof.

Ein gutes Stichwort! http://www.bw-stimmt-ab.de/

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11335

Hi!

Hm, verstehe dein Ansinnen, passt das aber in eine Einführung ins Schreiben von Skripten? Teilweise steht es ja auch dabei, so in der Art "Skript in einen Editor laden, unter aussagekräftigem Namen abspeichern und ausführbar machen. Der Aufruf erfolgt im Terminal mit ./skript.sh -OPTION", Sowas könnte man natürlich erwähnen, vielleicht auch bei Skripte

so long
hank

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Die Gefahr besteht ja immer, dass man gute Vorschläge übersieht. Hier und heute konnte ich jedoch schlimmstes verhindern, und komme auf den guten Vorschlag vom 12. April 2010 19:38 zurück:

track schrieb:

Einladung angenommen. Auch dass noch noch immer die externen Funktionen test und [ anstelle der mächtigeren internen Funktion [[ verwendet wird, gehört dann dabei korrigiert. Das entspricht nun wirklich nicht heutigen Standards und Empfehlungen.

Ich halte die Zeit für reif, das kurz und schmerzlos umzusetzen.

Danach könnte man eine orangene Hinweisbox einpflegen mit häufigen Fehlern, als da wären fehlende Leerzeichen bei "$foo" = "bar". Man möchte aber vielleicht zuvor diskutieren, ob man verschiedene Hinweise so hier und da hin träufelt - also beliebte if-Fehler bei if, beliebte Zuweisungsfehler bei Zuweisung, usw. Womöglich endet der if-Fehler dann gar nicht bei if, sondern bei einer übergeordneten Position.

Oder ist eine eigene Wikiseite Shellfehler besser? Die ist wohl leichter aus dem Kopf wiederzufinden und vom Forum aus zu verlinken.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Oder ist eine eigene Wikiseite Shellfehler besser?

Da der Skripting-Guide eh' schon lang ist, wäre eine eigene Unterseite wohl besser.

Gruß, noisefloor

kaputtnik

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9245

Wie starte ich ein Skript im Terminal und gebe die Eingabeaufforderung wieder frei?

Zur Erläuterung: Wenn ich ein Skript als Autostartanwendung starte, läuft es als eigener Prozess im Hintergrund. Starte ich es im Terminal, läuft es nur so lange wie das Terminal auch geöffnet bleibt.

Zielverhalten: Ein Skript soll gestartet werden und auch bei beenden des Terminals weiter laufen.

Wie geht das?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

track@lucid:~$ ./backgroundscript  &
track@lucid:~$ disown 

Das ist allerdings wirklich nichts für ein Anfängertutorial.

Auch sonst besteht kein Handlungsbedarf, denn es steht ja alles schon ausführlich im Wiki Prozessteuerung.

LG,

track

kaputtnik

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9245

Danke ☺

Man muss halt Wissen wo man suchen muss 😬 Shell/Prozesssteuerung war mir entgangen, obwohl es naheliegend gewesen wäre 😕

Gruß
kaputtnik

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Heinrich Schwietering schrieb:

Nur noch das: Im Baustelle/Shell/Bash-Skripting-Guide für Anfänger stehen so weit ich weiß du und Vain als Bearbeiter drin; aber das kann natürlich jeder, der sich berufen fühlt, zu Ende bringen.

Meines Wissens braucht man spezielle Wikirechte um den Artikel zu verschieben, sonst hätte ich es längst getan.

Als Fertigstellungstermin steht da ein Termin vom Frühjahr - er hätte also längst verschoben sein dürfen - ich würde das für ein Versäumnis des Wikiteams halten. Ansonsten gehört ein Hinweis ins Wikihowto, wie man Artikel aus der Baustelle verschiebt, oder ich fand ihn nur nicht, das kann natürlich auch sein, zwischen den ganzen Hinweisen, wie man einen Editor öffnet.

Moderiert von Heinrich Schwietering:

Von baustelle-shebang abgetrennt, da es sich auf diesenArtikel hier bezieht.