• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

shellscripten: wie krieg ich den stdout in eine shellvariable?

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
hi

mein Problem heute ist folgendes. Ich habe eine Variable "elements" und in dieser Variablen soll die Anzahl aller Dateien gespeichert werden die so aussehen: "*-test.tar.gz", wobei im *-Bereich immer das aktuelle Datum steht.

ich dachte, dass müsste mit folgendem Befehl funktionieren:
Code:
elements=ls *-test.tar.gz | wc -l | tr -d " "

ls *-test.tar.gz => holt mir alle Dateien die ich suche
wc -l => zählt die Anzahl der Einträge aus ls
tr -d " " => löscht alle vorlaufenden Leerzeichen aus wc

So, das funktioniert auch wunderbar. Aber das Ergebnis von tr landet jetzt nicht in elements sondern wird direkt auf die Konsole rausgeworfen. Dann funktioniert natürlich der Rest vom shellscript nicht mehr...

und wie fange ich solche Fehler im folgenden Code eigentlich ab?

ich hab so einen Test eingebaut:


Code:
if test $elements; then
        # nichts
else
        echo "keine Dateien gefunden"
        exit 1
fi

der soll im Prinzip nur gucken ob in elements überhaupt was drin steht. eigentlich sollte dieser Test NICHT 0 liefern (ergo FALSE) und dann den Teil im else Zweig ausführen.

a) wie kann ich so einen test umdrehen?
ich sag das mal in PHP:
PHP:
#nicht so:
if($elements){}else{
    echo "keine Dateien gefunden";
    return;
}

#sondern so:
if(!$elements){
    echo "keine Dateien gefunden";
    return;
}
b) wieso funktioniert das jetzt nicht?

c) wie wäre es denn richtig?
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
Original geschrieben von Sholvar


eigentlich sollte dieser Test NICHT 0 liefern (ergo FALSE)

leider falsch. wenn die shell 0 zurückgibt ist der wert wahr! eine besonderheit der shell! hab grad keine zeit aber vielleicht hilft das ja schon weiter!

du kannst mit $? den rückgabewert prüfen, google mal danach
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
btw sholvar sowas ist wesentlich einfacher mit perl zu machen. da du eh php erfahrung hast, solltest du dir perl mal anschauen. gerade für *nix administrativen kram, bist du mit perl 10x schneller am ziel als mit shellskripten. und perl ist sehr viel flexibler.
 

Aule2

Guest
allerdings ist die bash mittlerweile schon sehr sehr mächtig!

auch funktionieren diese hier um einen Befehl auszuführen:
elements=`anweisungsfolge`
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
da will ich dir nicht wiedersprechen. allerdings bietet perl durch CPAN möglichkeiten, für die man bei shell jahre lange programmier erfahrung brauch. ich kann nur wärmstens empfehlen, sich perl zu gemüte zu führen, gerade für administrative tasks. perl wird immer auf cgi reduziert, dabei ist das nur ein kleiner, wenn auch recht wichtiger aspekt der sprache, zumindest für zb Amazon oder auch wikisoftware.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
der soll im Prinzip nur gucken ob in elements überhaupt was drin steht. eigentlich sollte dieser Test NICHT 0 liefern (ergo FALSE) und dann den Teil im else Zweig ausführen.

in elements steht die ausgabe drinnen. test ! -z "$elements" oder so.

p.s. wird cgi überhaupt noch verwendet ?
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
wurden nicht letztens erst viele COBOL Programmierer gesucht?
Na klar wird das noch genutzt. Wenn für irgendwelche Seiten ein paar tausend Zeilen Code dafür existieren, dann will das doch keiner nochmal schreiben (bzw. dafür bezahlen, dass es nochmal geschrieben wird).

Perl werde ich mir bei Gelegenheit auch mal angucken, wenn ich wieder mal was größeres schreiben muss, oder die Meilensteine mal nicht so eng zusammen stehen. ;)

Ich hätte das jetzt ja auch in Java, C oder PHP schreiben können, hab mich aber für nen shellscript entschieden, weil es einfach nicht mehr auszuhalten war, jeden Tag an nem Linuxrechner zu sitzen und kaum einen Plan zu haben, was ich mit der bash alles machen kann.
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
Original geschrieben von Sholvar

weil es einfach nicht mehr auszuhalten war, jeden Tag an nem Linuxrechner zu sitzen und kaum einen Plan zu haben, was ich mit der bash alles machen kann.

du lernst es auch mit perl, vielleicht einfacher. jedes shellkommando ist in perl nachgebaut worden. die syntax ist einfacher und durch hashes ( assotiative arrays ) hast du viel mehr möglichkeiten.
 

Aule2

Guest
ich denke der große vorteil von shell-skripten ist, dass man die direkt in die Konsole eingeben kann und damit schon auch wirklich lustige Dinge sehr sehr einfach und vor allem einmalig machen kann;
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
ja aule bestreite ich nicht, gleiches geht aber auch mit perl :)
larry wall hat sich halt in allen sprachen bedient und da er ursprünglich nur ein programm, das flexibler als awk sein sollte schreiben wollte, ist es halt auch sehr unix nah. lohnt sich auf jedenfall mal anzuschauen.

und die bücher dazu sind auch extrem lustig, so mancher schenkel klopfer ist dabei.

lisp.jpg
 
Oben