PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash Script bleibt einfach stehen...



JDieskau
03-07-2004, 14:25
Also ich hab ein kleines Shell Script. Jetzt hab ich aber das Problem das es einfach stehen bleibt - keine Fehlermeldung - einfach nix. Wenn ich das ganze Schritt für Schritt in einer Konsole manuel mache, dann gehts ohne Probleme! Komisch :(

Also das ist der Teil von Bash Script:

if [ $1 = "--update" ]
then
cd /tmp/
#### Aktualisieren der discr ####
discrz=0
wget http://jdcvs.sourceforge.net/home/discr 2> /tmp/jdcvs-wget-discr >> /tmp/jdcvs-wget-discr
wget http://jdcvs.sourceforge.net/home/discr2 2> /tmp/jdcvs-wget-discr2 >> /tmp/jdcvs-wget-discr2

schleife=$(grep "entries=" /tmp/discr | sed s/entries=//g)

while [ $schleife != 0 ] 2> /dev/null
do

echo $schleife
#####################
#### HIER BLEIBT ER STEHEN!##
#####################
appsname=$(grep "§$schleife=" /tmp/discr | sed s/"§$schleife"=//g)
if [ $(grep -c $appsname ~/.jdcvs/discr) = 0 ]
then

discrname=$(grep "§$schleife=" /tmp/discr | sed s/§$schleife=//g)
discr=$(grep $discrname /tmp/discr2 | sed s/$discrname=//g)
discrz=$(expr $discrz + 1)
echo "$discrname=$discr" >> ~/.jdcvs/discr
fi

schleife=$(expr $schleife - 1)
done

rm /tmp/discr
rm /tmp/discr2
echo -e "\n$discrz $(grep "§77=" ~/.jdcvs/lang/$lang | sed s/§77=//g)"
#### Aktualisieren der sources ####
cd /tmp
sourcesz=0
wget http://jdcvs.sourceforge.net/home/sources 2> /tmp/jdcvs-wget-sources >> /tmp/jdcvs-wget-sources
wget http://jdcvs.sourceforge.net/home/sources2 2> /tmp/jdcvs-wget-sources2 >> /tmp/jdcvs-wget-sources2

schleife=$(grep "entries=" /tmp/sources | sed s/entries=//g)

while [ $schleife != 0 ]
do
if [ $(grep -c $(grep "§$schleife=" /tmp/sources | sed s/§$schleife=//g) ~/.jdcvs/sources) = 0 ]
then
sourcesname=$(grep "§$schleife=" /tmp/sources | sed s/§$schleife=//g)
sources=$(grep $sourcesname /tmp/sources2 | sed s/$sourcesname=//g)
sourcesz=$(expr $sourcesz + 1)
echo "$sourcesname§$sources" >> ~/.jdcvs/sources

fi
schleife=$(expr $schleife - 1)
done
rm /tmp/sources
rm /tmp/sources2
echo -e "$sourcesz $(grep "§79=" ~/.jdcvs/lang/$lang | sed s/§79=//g)\n"

exit
fi

Die /tmp/discr sieht dann ungefähr so aus:

entries=33

§33=multisync
§32=atlantik
§31=krecipes
§30=fhp
§29=feta
§28=epiphany
...

Geht dann natürlich bis §1 weiter.
Die /tmp/discr2 sieht dann so aus:

entries=33

kdebluetooth=The KDE Bluetooth Framework is a set of tools built on top of Linux\' Bluetooth stack BlueZ
multisync=MultiSync is a program to synchronize calendars, addressbooks and other PIM data between programs on your computer and other computers, mobile devices, PDAs or cell phones.
atlantik=Atlantik is the leading open-source game client for Monopoly®-like board games to be played on the monopd network.
krecipes=Krecipes is a new Open Source project for an exciting world that is almost forgotten in the Tux world: COOKING (yummy! ;-)
gcc=GCC is the GNU Compiler Collection, which currently contains front ends for C, C++, Objective-C, Fortran, Java, and Ada

Geht natürlich auch noch weiter.
Aber was ist daran nun falsch? Ich versteh das einfach nicht :(
Ohne Fehlermeldung - und auf der Konsole geht es ohne murren... :confused:

peschmae
03-07-2004, 18:44
mir scheint Grep hat irgendwelche Probleme mit dem § in Dateien - anders kann ich mir das nicht erklären.

Wirklich merkwürdig die Sache.

MfG Peschmä

msi
03-07-2004, 19:46
if [ $(grep -c $(grep "§$schleife=" /tmp/sources | sed s/§$schleife=//g) ~/.jdcv

dz solltest nach der if anweisung noch einen echo block einbauen und testen ob die eingabe dort noch einmal rescheint.
außerdem muss das $ in dem grep seartchtext durch ein \$ ersetzt werden, da sonst ein zeilenende gemeint wäre.
Dasselbe gilt afaik auch für sed

peschmae
03-07-2004, 20:37
außerdem muss das $ in dem grep seartchtext durch ein \$ ersetzt werden, da sonst ein zeilenende gemeint wäre.
Dasselbe gilt afaik auch für sed

Nein. Weil das $irgendwas wird durch die bash behandelt, nicht durch sed oder Grep (ausser du hast einfache Anführungszeichen drumherum, dann werden die Variablen nicht eingesetzt) - d.h. sed und Grep kriegen den Inhalt der Variable geliefert - also die expandierte Version. Die sehen gar kein $ mehr.

Ausserdem steht das $ nur für Zeilenende wenn es am Ende eines Grep/Sed-Ausdrucks steht. Sonst ist es ein ganz normales Zeichen.

MfG Peschmä

peschmae
04-07-2004, 09:16
Hmm, wenn ich manuell
schleife=33
vor Schleifenbeginn setze gehts weiter :confused:

MfG Peschmä

micha
04-07-2004, 18:43
Hi,

die Datei /tmp/discr ist im Windowsformat, deshalb wurde $schleife nicht als
Zahl erkannt (expr: non-numeric argument).
Nachdem ich die Datei mit dos2unix konvertiert habe, gabs noch eine Fehlermeldung bei der If-Anweisung: [: =: unary operator expected

So funktionierts zumindest bei mir:



#!/bin/bash

cd /tmp/
#### Aktualisieren der discr ####
discrz=0
wget http://jdcvs.sourceforge.net/home/discr 2> /tmp/jdcvs-wget-discr >> /tmp/jdcvs-wget-discr
wget http://jdcvs.sourceforge.net/home/discr2 2> /tmp/jdcvs-wget-discr2 >> /tmp/jdcvs-wget-discr2

dos2unix /tmp/discr

schleife=$(grep "entries=" /tmp/discr | sed s/entries=//g)

while [ $schleife != 0 ]; do
echo $schleife
appsname=$(grep "$schleife=" /tmp/discr | cut -d '=' -f 2)

if [ -z "$(grep $appsname ~/.jdcvs/discr 2>/dev/null)" ]; then
discrname=$appsname
discr=$(grep $discrname /tmp/discr2 | sed s/$discrname=//g)
discrz=$(expr $discrz + 1)
echo "$discrname=$discr" >> ~/.jdcvs/discr
fi

schleife=$(expr $schleife - 1)
done


Gruß
micha

P.S.: Für das '§'-Zeichen hab ich keine Lösung außer weglassen gefunden.

JDieskau
05-07-2004, 13:05
Hi,

die Datei /tmp/discr ist im Windowsformat, deshalb wurde $schleife nicht als
Zahl erkannt (expr: non-numeric argument).
Nachdem ich die Datei mit dos2unix konvertiert habe, gabs noch eine Fehlermeldung bei der If-Anweisung: [: =: unary operator expected

So funktionierts zumindest bei mir:



#!/bin/bash

cd /tmp/
#### Aktualisieren der discr ####
discrz=0
wget http://jdcvs.sourceforge.net/home/discr 2> /tmp/jdcvs-wget-discr >> /tmp/jdcvs-wget-discr
wget http://jdcvs.sourceforge.net/home/discr2 2> /tmp/jdcvs-wget-discr2 >> /tmp/jdcvs-wget-discr2

dos2unix /tmp/discr

schleife=$(grep "entries=" /tmp/discr | sed s/entries=//g)

while [ $schleife != 0 ]; do
echo $schleife
appsname=$(grep "$schleife=" /tmp/discr | cut -d '=' -f 2)

if [ -z "$(grep $appsname ~/.jdcvs/discr 2>/dev/null)" ]; then
discrname=$appsname
discr=$(grep $discrname /tmp/discr2 | sed s/$discrname=//g)
discrz=$(expr $discrz + 1)
echo "$discrname=$discr" >> ~/.jdcvs/discr
fi

schleife=$(expr $schleife - 1)
done


Gruß
micha

P.S.: Für das '§'-Zeichen hab ich keine Lösung außer weglassen gefunden.
Danke, das hatte ich nun auch schon vorher rausbekommen, aber trotzdem Danke :D
Wenn mir jetzt noch einer sagen könnte warum das im Dos Format vorliegt wäre das sehr nett... Nicht jeder hat dos2unix und es wäre schöner wenn es nicht unbedingt gebraucht wird.
Natürlich geht es auch so...

Das ganze liegt auf einem sf.net Server und die Datei kann online editiert werde, das Teil dafür ist in PHP geschrieben. Liegt das jetzt an PHP oder am sf Server?

micha
05-07-2004, 20:56
Statts



dos2unix /tmp/discr


geht auch



recode ibmpc..lat1 /tmp/discr


Gruß,
micha

JDieskau
06-07-2004, 13:56
recode ibmpc..lat1 /tmp/discr


Da würde ich dann den Fehler hier bekommen:
ecode: discr failed: Mehrdeutige Ausgabe in step `CR-LF..data'
Naja, mit dos2unix gehts ja erstmal... ;)