Script - If - immer false...

myth88

myth88

Haudegen
Hi Leute,
ich bin grad ein Script (mein erstes!) am schreiben, das automatisch die tar.bz2 SVN tarballs von aMule runterlaed, diese entpackt, als 7z packt, und dann auf einen FTP von mir uploaded...

Nur happert es bei einer doofen IF...

Hier mal der Code:
Code:
#!/bin/bash
# this is a small script to download the last aMule tarball in tar.bz2 format, 
# unpack it, pack it as 7z and upload it to my host...

cd /mnt/storage/longtemp/emule_mods/amule
wget http://amule.sourceforge.net/tarballs/tarballs.xml -O /mnt/storage/longtemp/emule_mods/amule/tarballs.xml
amulerev=`cat /mnt/storage/longtemp/emule_mods/amule/tarballs.xml | grep -o youngest=\'....\' | grep -o [0-9][0-9][0-9][0-9]`
localver=`ls /mnt/storage/longtemp/emule_mods/amule/ | grep -o [0-9][0-9][0-9][0-9] | tail -1`
if [ "$amulerev" > "$localver" ]; then 
	wget http://amule.sourceforge.net/tarballs/aMule-SVN-r$amulerev.tar.bz2 -O /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.tar.bz2
	bunzip2 aMule-SVN-r$amulerev.tar.bz2
	tar xvf aMule-SVN-r$amulerev.tar
	7z a aMule-SVN-r$amulerev.7z /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev/

	HOST='meinhost.xyz.net'
	USER='mein_user'
	PASSWD='passwort'
	FILE='/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.7z'

	ftp -n $HOST 
	quote USER $USER
	quote PASS $PASSWD
	cd /www/tarballs/
	put $FILE
	quit
	
else
	echo "No new tarball found!"
fi

Die IF gibt immer False auf...obwohl zb. in diesem Fall $amulerev 9677 ausgibt, und $localrev 9676...
Hat jemand eine Idee dazu?
 
Schon mal mit
Code:
if [ $amulerev -gt $localver ]; then
versucht?

Ich gehe mal davon aus, dass beide Variablen Zahlen enthalten...

Code:
<12:45:53> [~] A=1
<12:45:55> [~] B=2
<12:45:57> [~] if [ $B -gt $A ]; then echo "muuuuh"; else echo "hehe"; fi
muuuuh
 
Zuletzt bearbeitet:
....da bekomm ich nur: [: 29: Illegal number:

EDIT: Es waren die Quotes...

if [ $amulerev -gt $localver ]; then

so geht es :)
 
Zuletzt bearbeitet:
zunächst mal ein verbeserungsvorschlag. dein cd ist unnötig. das könntets du einfach so machen.

wget --directory-prefix=/mnt/storage/longtemp/emule_mods/amule http://amule.sourceforge.net/tarballs/tarballs.xml -O /mnt/storage/longtemp/emule_mods/amule/tarballs.xml

dein bunzip ist auch unnötig. das ließe sich schneller mittel tar xjf in einem rutsch entpacken.

zu deinem problem. >, < sind ja integer vergleichoperatoren. da aber ein release name aus punkten und alphanumerischen zeichen bestehen kann. würde ich es mit string comparsion versuchen. also mit den == und != Operatoren.

ok es waren ein paar vebesserungsvorschläge:

achja hier kommt noch einer. du könntest die Variablen die dein Script braucht am anfang setzen. das macht es übersichlticher.
 
Zuletzt bearbeitet:
Hmm...noch funkt was beim ftp nicht...das will ich erst beheben...

Code:
#!/bin/bash
# this is a small script to download the last aMule tarball in tar.bz2 format, 
# unpack it, pack it as 7z and upload it to my host...

cd /mnt/storage/longtemp/emule_mods/amule
wget http://amule.sourceforge.net/tarballs/tarballs.xml -O /mnt/storage/longtemp/emule_mods/amule/tarballs.xml
amulerev=`cat /mnt/storage/longtemp/emule_mods/amule/tarballs.xml | grep -o youngest=\'....\' | grep -o [0-9][0-9][0-9][0-9]`
localver=`ls /mnt/storage/longtemp/emule_mods/amule/ | grep -o [0-9][0-9][0-9][0-9] | tail -1`
if [ $amulerev -gt $localver ]; then 
	wget http://amule.sourceforge.net/tarballs/aMule-SVN-r$amulerev.tar.bz2 -O /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.tar.bz2
	tar xvf aMule-SVN-r$amulerev.tar.bz2
	7z a aMule-SVN-r$amulerev.7z /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev/
	rm -R /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev/
	

	HOST='meinhost'
	USERNAME='ich'
	PASSWD='meinpass'
	FILE='/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.7z'

	ftp -in
	open $HOST
	user $USERNAME $PASSWD
	bin
	put $FILE /www/tarballs/aMule-SVN-r$amulerev.7z
	close
	quit
	
else
	echo "No new tarball found!"
fi

Wenn ich den script aufrufe, macht er alles, bis hin zu ftp...

...da passiert nichts, und er bleibt in der console stehen, mit ftp>

Wenn ich dann manuell quit schreibe, sehe ich folgendes:

Code:
Couldnt get a file descriptor referring to the console
tar.bz2.-.7z.sh: 31: user: not found
tar.bz2.-.7z.sh: 31: bin: not found
tar.bz2.-.7z.sh: 31: put: not found
tar.bz2.-.7z.sh: 31: close: not found
tar.bz2.-.7z.sh: 31: quit: not found
 
ich weiß des jetzt nicht so genau, aber öffnet der ftp befehl nicht einfach ne subshell.

schau die mal das advanced bash scripting guide und das kapitel subshells an.
 
Hi,

Code:
	ftp -in
	open $HOST
	user $USERNAME $PASSWD
	bin
	put $FILE /www/tarballs/aMule-SVN-r$amulerev.7z
	close
	quit

das kann ja auch nicht funktionieren. Eventuell wolltest du da ein Here-Dokument von machen?
Code:
	ftp -in << EOF
	open $HOST
	user $USERNAME $PASSWD
	bin
	put $FILE /www/tarballs/aMule-SVN-r${amulerev}.7z
	close
	quit
	EOF

mfg,
bytepool
 
Zuletzt bearbeitet:
Ok, EDIT!

Nach der Aenderung wie von bytepool beschrieben:
Code:
#!/bin/bash
# this is a small script to download the last aMule tarball in tar.bz2 format, 
# unpack it, pack it as 7z and upload it to my host...

cd /mnt/storage/longtemp/emule_mods/amule
wget http://amule.sourceforge.net/tarballs/tarballs.xml -O /mnt/storage/longtemp/emule_mods/amule/tarballs.xml
amulerev=`cat /mnt/storage/longtemp/emule_mods/amule/tarballs.xml | grep -o youngest=\'....\' | grep -o [0-9][0-9][0-9][0-9]`
localver=`ls /mnt/storage/longtemp/emule_mods/amule/ | grep -o [0-9][0-9][0-9][0-9] | tail -1`
if [ $amulerev -gt $localver ]; then 
	
	wget http://amule.sourceforge.net/tarballs/aMule-SVN-r$amulerev.tar.bz2 -O /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.tar.bz2
	tar xvf aMule-SVN-r$amulerev.tar.bz2
	7z a aMule-SVN-r$amulerev.7z /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev/
	rm -R /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev/
	
	
	HOST='meinhost'
	USERNAME='ich'
	PASSWD='meinpass'
	FILE='/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.7z'
	
	ftp -in << EOF
	open $HOST
	user $USERNAME $PASSWD
	bin
	put $FILE /www/tarballs/aMule-SVN-r$amulerev.7z
	close
	quit
	EOF
	
else
	echo "No new tarball found!"
fi

Bekomme ich trotzdem: tar.bz2.-.7z.sh: 34: Syntax error: end of file unexpected (expecting "fi")
 
Probiers mal so:
Code:
echo "open ${HOST}\nuser ${USERNAME} ${PASSWD}\nbin\nput ${FILE} /www/tarballs/aMule-SVN-r${amulerev}.7z\nclose\nquit" | ftp -in

//edit: Oh, bytepool war schneller.
 
Ok, schon besser, jetzt bekomm ich das expected FI nicht mehr...aber...

local: /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r$amulerev.7z: No such file or directory
 
du hast deine variablen falsch gequotet. du muss "" statt '' nehmen.
 
Ok...` geht ja auch...zumindest habe ich das oben verwendet...und ' war nur ein dummer Fehler :/

Trotzdem bekomme ich folgendes:

tar.bz2.-.7z.sh: 26: meinhost: not found
tar.bz2.-.7z.sh: 26: meinusername: not found
tar.bz2.-.7z.sh: 26: meinpass: not found
tar.bz2.-.7z.sh: 26: /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z: Permission denied

Und da bleibt er haengen...bis ich CTRL-C mache....
 
ruf mal das script mit sh -x scriptname auf und poste den output hier, damit ich mal gucken kann was da eigentlich passiert.
 
Hmm...den ganzen output kann ich nicht posten...waere sehr lang, mit dem ganzen unpack und pack-kram...

Aber das relevante ist sicher das hier:

Code:
Everything is Ok
+ rm -R /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679/
+ amule-tarballs.atbhost.net
tar.bz2.-.7z.sh: 1: amule-tarballs.atbhost.net: not found
+ HOST=
+ meinusername
tar.bz2.-.7z.sh: 1: meinusername: not found
+ USERNAME=
+ meinpassword
tar.bz2.-.7z.sh: 1: meinpassword: not found
+ PASSWD=
+ /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z
tar.bz2.-.7z.sh: 1: /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z: Permission denied
+ FILE=
+ echo+ ftp -in
 open \nuser  \nbin\nput  /www/tarballs/aMule-SVN-r9679.7z\nclose\nquit
^C(to) {MEIN CTRL-C}
Not connected.
Not connected.
Not connected.

Danke schonmal! :)
 
machst doch mal wie ich dir gesagt habe. die variablen am anfang des scripts setzen und richtig quoten. dann sollte das eigentlich laufen.
 
Zuletzt bearbeitet:
Hi,

Ok...` geht ja auch...zumindest habe ich das oben verwendet...und ' war nur ein dummer Fehler :/
du musst beim Shell Skripting genauestens auf das Quoting achten, `, ', und " haben alle unterschiedliche Funktionen, und sie sind auf keinen Fall irgendwie austauschbar.
Ich weiss nicht ob du dich an der zitierten Stelle nur verschrieben hast, aber so wie es da steht, ist es ziemlich falsch: Backticks (`) statt Single Quotes (') wird sicher nicht funktionieren.

Code:
+ echo+ ftp -in
 open \nuser  \nbin\nput  /www/tarballs/aMule-SVN-r9679.7z\nclose\nquit
Auch das kann nicht funktionieren, weil echo die '\n's nicht interpretiert und ftp nichts mit dem Input anfangen kann, aber mit "echo -e" solltest du das gewuenschte Verhalten erzwingen koennen.

mfg,
bytepool
 
Scheinbar tut es echo -e auch nicht :/

Code:
+ rm -R /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679/
+ HOST=meinhost
+ USERNAME=meinuser
+ PASSWD=meinpass
+ FILE=/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z
+ echo -e open meinhost\nuser meinuser meinpass\nbin\nput /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z /www/tarballs/aMule-SVN-r9679.7z\nclose\nquit
+ ftp -in
?Invalid command
Not connected.
Not connected.
Not connected.
Not connected.
 
Hi,

dann rueck doch mal den letzten Stand deines Quelltextes raus, wer soll denn da jetzt noch durchblicken? ;p

Bei mir funktioniert naemlich beides wunderbar, sowohl die Variante mit dem Here-Dokument, als auch die Variante mit "echo -e". Jedenfalls fuer kleine ftp Testkommandos, dein ganzes Skript habe ich natuerlich nicht getestet.

Edit:
Nebenbei, hast du ueberhaupt mal versucht, ob die ftp Befehlsfolge korrekt ist? Ich koennte mir vorstellen dass der genaue Ablauf von Server zu Server unterschiedlich sein kann, aber wenn ich mich versuche zu einem oeffentlichen ftp Server zu verbinden, werde ich direkt nach Namen und Passwort gefragt, ohne dass ich noch "user" oder so eingeben muesste/koennte. Das koennte auch ein Problem sein, so dass der Login fehlschlaegt, und der Rest der Befehlsfolge dann auch nicht mehr korrekt verarbeitet werden kann.

Edit2:
Die Option -v von ftp koennte in dem Zusammenhang auch dein Freund sein.

mfg,
bytepool
 
Zuletzt bearbeitet:
die komplette ausgabe von sh -x als anhang wäre auch noch aufschlussreich.
 
Ok....ich habe einfach mal sh script.sh > output.txt gemacht...

...in die Output hat er nur den output von tar und 7z und die Fehlermeldung von ftp gepackt...
...den Rest hat er in der console gelassen :P

Jetzt habe ich es mal mit script gemacht...aber weiss nicht, was ich mit der ouputdatei anfangen soll :/

Also fuer nun mal der output, wie ich ihn habe...

Code:
dude@dude-desktop:/mnt/storage/coding/xMule/amule$ sh -x tar.bz2.-.7z.sh > output.txt
+ cd /mnt/storage/longtemp/emule_mods/amule
+ wget http://amule.sourceforge.net/tarballs/tarballs.xml -O /mnt/storage/longtemp/emule_mods/amule/tarballs.xml
--2009-06-22 20:36:24--  http://amule.sourceforge.net/tarballs/tarballs.xml
Resolving amule.sourceforge.net... 216.34.181.96
Connecting to amule.sourceforge.net|216.34.181.96|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2625 (2.6K) [text/xml]
Saving to: `/mnt/storage/longtemp/emule_mods/amule/tarballs.xml'

100%[==============================================================================>] 2,625       --.-K/s   in 0.006s  

2009-06-22 20:36:25 (423 KB/s) - `/mnt/storage/longtemp/emule_mods/amule/tarballs.xml' saved [2625/2625]

+ cat /mnt/storage/longtemp/emule_mods/amule/tarballs.xml
+ grep -o youngest='....'
+ grep -o [0-9][0-9][0-9][0-9]
+ amulerev=9679
+ ls /mnt/storage/longtemp/emule_mods/amule/
+ grep -o [0-9][0-9][0-9][0-9]
+ tail -1
+ localver=9678
+ [ 9679 -gt 9678 ]
+ wget http://amule.sourceforge.net/tarballs/aMule-SVN-r9679.tar.bz2 -O /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.tar.bz2
--2009-06-22 20:36:25--  http://amule.sourceforge.net/tarballs/aMule-SVN-r9679.tar.bz2
Resolving amule.sourceforge.net... 216.34.181.96
Connecting to amule.sourceforge.net|216.34.181.96|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4460135 (4.3M) [application/x-bzip2]
Saving to: `/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.tar.bz2'

100%[==============================================================================>] 4,460,135    120K/s   in 37s     

2009-06-22 20:37:03 (117 KB/s) - `/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.tar.bz2' saved [4460135/4460135]

+ tar xvf aMule-SVN-r9679.tar.bz2
+ 7z a aMule-SVN-r9679.7z /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679/
+ rm -R /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679/
+ HOST=meinhost
+ USERNAME=meinusername
+ PASSWD=meinpass
+ FILE=/mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z
+ echo -e open meinhost\nuser meinusername meinpass\nbin\nput /mnt/storage/longtemp/emule_mods/amule/aMule-SVN-r9679.7z /www/tarballs/aMule-SVN-r9679.7z\nclose\nquit
+ ftp -in
dude@dude-desktop:/mnt/storage/coding/xMule/amule$

und das was mit der umlenkung rausgekommen ist:

Code:
aMule-SVN-r9679/
aMule-SVN-r9679/m4/
.......
aMule-SVN-r9679/Makefile.in

7-Zip  4.58 beta  Copyright (c) 1999-2008 Igor Pavlov  2008-05-05
p7zip Version 4.58 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Scanning

Creating archive aMule-SVN-r9679.7z

Compressing  aMule-SVN-r9679/docs/ABOUT-NLS
........
Compressing  aMule-SVN-r9679/intl/plural.y

Everything is Ok
?Invalid command
Not connected.
Not connected.
Not connected.
Not connected.
 

Ähnliche Themen

Queue für copy Script

svn import "500 Internal Server Error"

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

NagiosGrapher 1.7.1 funktioniert nicht

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

Zurück
Oben