Seitenanfang

Parameterbehandlung in Bash-Scripten

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.


In unseren SVN-Trunks liegen tonnenweise alte Scripte und Module, viele werden gar nicht mehr benutzt und können einfach "entsorgt" werden. Damit wird alles in Zukunft leichter pflegbar und weniger "toter Source" muss bei jeder Änderung der zentralen Module berücksichtigt werden. Um diesen Source zu finden, habe ich ein mittlerweile recht umfangreiches Bash-Script entworfen.

Dieses kann unter anderem einen "grep" in allen Trunks ausführen und dabei einige unerwünschte Files (.svn/*, *.tidybak, etc.) filtern, allerdings hapert es an der Parameterübergabe zu grep.

Das eigentliche Problem sind Suchbegriffe die ein Leerzeichen enthalten:

mytool.sh grep "foo bar"
Der erste Parameter "grep" wählt die interne Funktion des Scriptes, danach sollen Grep-Parameter und der Suchbegriff folgen. Mein erster Versuch war (bereinigt um weitere Argumente) ein
grep -r $* /checkouts/$USER/
allerdings wird daraus ein
grep -r foo bar /checkouts/$USER/
Grep versucht dann "foo" in der Datei "bar" und im angegebenen Verzeichnis zu finden - keine gute Idee. Der nächste Versuch war schon beinahe gut:
save_args=""while [ ! -z "$1" ]; do { save_args="$save_args '$1'"; shift; }; done;
Allerdings entstanden dabei ziemlich unerwartete und (für mich bisher) unerklärliche Nebeneffekte, die meinen Grep auch für einfache Suchabfragen häufig funktionslos machten.
Ein bisschen googlen brachte mich gerade auf "$@" und ein kleines Testscript zeigte erstaunliche Ergebnisse:
#!/bin/bashfor N in "$@"; do echo $N; done;echo "---"shiftfor N in "$@"; do echo $N; done;
Das Ergebnis war beeindrucken:
./t.sh 1 "2 3" 4 512 345---2 345
Genau das habe ich gesucht! Mit "shift" kann ich den Funktionsauswahl-Paramter abschneiden - denn er dient nur der Funktionsauswahl - und alles Weitere wird anscheinend sauber übergeben.
Wichtig sind dabei allerdings die " um das $@, denn ohne diese verhält es sich genau so wie $*. Mein grep-Aufruf im Script sieht jetzt so aus:
grep -r "$@" /checkouts/$USER/
und wird anstandslos ausgeführt. Manchmal ist alles viel einfacher als man denkt :-)
 

Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>