![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Mon, 08 Dec 2003, Karl Sinn schrieb:
David Haller schrieb:
Du willst dringend 'help while' lesen!
while: while COMMANDS; do COMMANDS; done ^!!
while test "$testen" != ""; do ... PS: Karl, mach dir bitte mal die Muehe und lese dir mal ein paar Grundlagen an und lerne diese, indem du jedes "Konstrukt" austestest. Im Archiv findest du da einige Texte zu, oder auch auf selflinux.de und anderswo.
JA, ICH WILL, ICH WILL, ICH WILL lol
*g*
Das ist ja gerade das was mich so nervös macht :-) Den ganzen Morgen habe ich rumgelesen, und noch nicht einmal ein einfaches if then fi hinbekommen. Ich habe übrigens in der Linuxfibel gelesen, und da habe ich folgenden Text gefunden (O-Ton: http://www.linuxfibel.de/bash.htm):
if Liste von Kommandos; then Liste von Kommandos [elif Liste von Kommandos; then Liste von Kommandos] [else Liste von Kommandos] fi
Und mit Liste von Kommandos, konnte ich so einfach nichts anfangen.
Siehe Abschnitt "Listen" im o.g. Dokument. Damit ist einfach ein oder mehrere Kommandos, die auch verknuepft sein koennen. if wertet dann nur den Exitstatus der gesamten Kette aus: if true; then echo "TRUE"; else echo "FALSE"; fi ^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^ das sind die "Liste von Befehlen". if true; false; then echo "TRUE"; else echo "FALSE"; fi if true; false; true; then echo "TRUE"; else echo "FALSE"; fi if false; false; true; then echo "TRUE"; else echo "FALSE"; fi if false; false; false; then echo "TRUE"; else echo "FALSE"; fi Hier ist jew. der "Exitcode" der "Liste von Befehlen" (in der Bedingung) jeweils _nur_ der Exitcode des letzten Befehls. if true && false; then echo "TRUE"; else echo "FALSE"; fi if true && false || true; then echo "TRUE"; else echo "FALSE"; fi Statt dem 'echo ""' kann jeweils auch eine bel. Anzahl Befehle stehen, z.B.: then echo "TRUE" grep foo /tmp/bar sleep 2 echo "Huhuu" else ... fi Hier ist alles zwischen "then" und "else" eine "Liste von Befehlen".
Zumal als Beispiel dann direkt sowas folgt:
if test $( id | awk -F'[=(]' '{print $2}'; ) -eq "0"; then echo Superuser; else echo Normaler User; fi
Dass das test darin so wichtig ist, habe ich nicht kapiert.
Ist es auch nicht :) Nur fuer das was gemacht werden soll. Schau dir mal an, zu was $() expandiert: id gibt u.a. als erstes die UID aus, in der Form 'uid=$UID(username)...'. Das awk popelt daraus dann die numerische UID heraus, z.B. 500 oder 0. Das ganze $() Konstrukt expandiert also zur UID des users. Was macht nun das test? user$ test $(...) -eq 0 expandiert z.B. zu: test 500 -eq 0 root# test $(...) -eq 0 expandiert zu: test 0 -eq 0 Wie du in 'help test' nachlesen kannst vergleicht test mit -eq Zahlen auf numerische Gleichheit und gibt bei Gleichheit 0 ("true"), bei Ungleichheit 1 ("false") als Exitstatus zurueck. Und dieser ist dann die Bedinung des 'if'. Das Beispiel ist uebrigens schlampig, denn es wird ein String als Vergleich angegeben.
Weiter unten:
while Bedingung do Liste von Kommandos done
until Bedingung do Liste von Kommandos done
Da steht kein Semikolon.
Das ist falsch bzw. ein "Bug" im Dokument. Da muss ein Zeilenumbruch oder ein Semikolon hin. while Liste von Befehlen do Liste von Befehlen done oder while Liste von Befehlen; do Liste von Befehlen; done Das sind einfach die generellen Regeln bzgl. Trennung von Kommandos in der bash.
Und mit Bedingung
Die Schleife wird solange ausgefuehrt, bis die "Liste von Befehlen" einen Exitstatus ungleich 0 zurueckgibt. i=0; while test $i -lt 5; do echo "$i"; i=$(( i + 1 )); done while false; do echo "wirste nicht sehen!"; done
Was willst du damit machen?
Die grundidee war etwas über Bashprogrammierung zu lernen. Die mir gestellte Aufgabe ist ein Script, dass alle Ihm übergebenen Dateien nach einem Muster durchnummeriert (fürs Photoalbum)
Ahso. Da bieten sich for `seq ... ` oder eine while-Schleife wie oben mit $i an, sowie printf um den Dateinamen zu formatieren, z.B.: i=1 ls *.jpg | while read dateiname do neuername="`printf 'Bild%06i' $i`" ### siehe 'man 1 printf' echo mv -i "$dateiname" "$neuername" i=$(( i + 1 )) done [das mv durch das echo entschaerft]
Jetzt werde ich erst mal alles was Ihr alle vorgeschlagen habt in Ruhe lesen, und testen, in meiner Linuxfibel weiterlesen, und dann mit Sicherheit wieder eine Frage stellen;
Kennst du den Text von Kristian? Und den von selflinux? http://www.koehntopp.de/kris/artikel/unix/shellprogrammierung/ http://www.selflinux.org/selflinux/html/shellprogrammierung.html -dnh -- Any research done on how to efficiently use computers has been long lost in the mad rush to upgrade systems to do things that aren't needed by people who don't understand what they are really supposed to do with them. -- Graham Reed