kleines shell script

Post Reply
Message
Author
oliver

kleines shell script

#1 Post by oliver »

also, da slackware nicht soviel mit automatisierung am hut hat, wollte ich ein kleines shell script basteln was mir das updaten/installieren etc. von slackware packages erleichtern soll:

#!/bin/bash
if [ ! -f /etc/suchepkg/CHECKSUMS ]; then
echo "First make pkg_update -update to update your checksums!"
else
cd /etc/suchepkg
export paket='grep $1.tgz CHECKSUMS'
fi

mein problem ist jetzt bei dem export paket...
weis da zufaellig grad wer die syntax damit er das annimmt?
danke im vorraus

oliver

Jochen

Re: kleines shell script

#2 Post by Jochen »

Ich denke, statt der Apostrophe '' hattest Du die Backticks `` verwenden wollen. Wenn Du schon die bash verwendest, würde ich die alternative Schreibweise $() empfehlen. So wird aus der export-Zeile dann <blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
export paket=$(grep "$1\<!--no-->\<!--no-->.tgz" CHECKSUMS)</font><hr></pre></blockquote>Der Punkt wird von grep übrigens als "genau ein beliebiges Zeichen" interpretiert werden und sollte daher wie o.a. entwertet werden. Es müssen aber zwei Backslashes sein, Weil die Shell noch eines entfernt (Backslash ist nun mal sowohl Sonderzeichen der Shell als auch der Regulären Ausdrücke).

Jochen

oliver

Re: kleines shell script

#3 Post by oliver »

hio,
es kommt zumindest kein fehler :)
aber leider gehts nicht :/

oliver

Jochen

Re: kleines shell script

#4 Post by Jochen »

Geht nicht gibt's nicht! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Vor allem deswegen, weil es als "Fehlerbericht" etwas ungenau ist. Was willst Du denn genau erreichen? Aus dem Skript lässt sich nur ersehen, dass Du aus der Datei /etc/suchepkg/CHECKSUMS eine Zeile (mehrere Zeilen?) herausgreppen willst, in denen "<übergebener Paketname>.tgz" vorkommt und diese Zeile einer Variablen "paket" zugeordnet werden soll. Ob es das Skript so tut, kannst Du auch durch ein "echo $paket" nach der export-Zeile testen.

So weit, so gut. Und dann? Meine Kristallkugel ist leider zienlich trübe...

Aber wenn ich jetzt mal tippen müsste... Da Du explizit die Variable "paket" exportierst, willst Du sie entweder in einem untergeordneten Skript verwenden - was vollkommen OK ist - oder, wie es häufig missverstanden wird, an ein übergeordnetes Skript zurückgeben. Das funktioniert so nicht.

Aber mehr tippe ich erst, wenn Du mal den gesamten Zusammenhang klar gemacht hast: Zielsetzung, erwartetes Ergebnis, andere Skripte drum herum usw.

Jochen

oliver

Re: kleines shell script

#5 Post by oliver »

also,
ich habs nich so mit sh scripting, hab nur absolute basics drauf, deswegen hab ich ein paar scripts gebaut die mir die packetverwaltung unter slackware vereinfachen sollen...
einmal ein "suchepkg" - dass das paket sucht zb.:
suchepkg qt
dann soll zb. qt-3.1.1copy.tgz rauskommen
das soll dann sofort runtergeladen werden soll (deswegen mit export damit ich dann wget ftp://ftp.slackware.at/$paket machen kann).

Jochen

Re: kleines shell script

#6 Post by Jochen »

Dann ist das Exportieren erst einmal überflüssig. Tipp mal in einer Shell<pre>VAR=inhalt ; echo $VAR</pre>ein, dass funktioniert schliesslich auch ohne Exportieren, nicht wahr? Setze Dein wget einfach hinten an das Skript dran!
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash
if [ ! -f /etc/suchepkg/CHECKSUMS ]; then
echo "First make pkg_update -update to update your checksums!"
else
cd /etc/suchepkg
export paket=$(grep "$1.*\<!--no-->.tgz" CHECKSUMS)
fi

wget ftp://ftp.slackware.at/$paket
</font><hr></pre></blockquote>
Probleme bei der Sache:
- Du hast keinerlei Fehlercheck da drinne. Wenn kein Treffer in der CHECKSUMS gefunden wird, ist $paket leer und wget wird Dir was husten.
- Das Format der CHECKSUMS-Datei ist mir nicht bekannt. Wenn da mehr als nur ein Dateiname pro Zeile drin steht, wird auch wieder bei wget ein so nicht existierender Dateiname zusammengesetzt.
- Was, wenn mehr als nur ein Treffer gefunden wird? Dann stehen alle Zeilen zusammen in $paket. Die müsste man einzeln bearbeiten, da sonst bei wget wieder die Syntax nicht eingehalten wird.
- Der Regexp bei grep muss anders aussehen. Wenn man mal annimmt, dass es reichen soll, den Anfang eines Paketnamens zu übergeben, dann mus wie o.a. noch ein ".*" eingefügt werden, da sonst nur der exakte Dateiname passen würde. (Beispiel: Bei Übergabe "qt" suchte Dein Skript nur nach "qt\<!--no-->.tgz", was nicht gefunden wurde. Statt dessen muss es nach "qt.*\<!--no-->.tgz" suchen, damit wie gewünscht auch "qt-3.1.1copy.tgz" gefunden wird.)

Da solltest Du Dir also noch mal Gedanken drüber machen...

Jochen

Post Reply