PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage und Auswerten von Dateien



20-09-2000, 20:30
Hi,
ich habe schon mehrere Fragen gestellt, die immer wieder auf einer FOR-Schleife nach dem Motto:

set=$(ls)
for i in do

...
done

Dazu habt Ihr mir auch schon einige tolle Antworten gesandt, aber ich mache wohl was falsch. Die Schleife läuft nie genau so oft durch, wie ich es erwarte.

Jetzt habe ich es mal so probiert

for i in $(ls)
do
done


Stimmt das?

Hat jemand eine getestete Abfrage, mit der er für alle Dateien in einem Verzeichnis einmal eine oder mehrere bestimmte Actionen einleitet?
MfG,
Werner
PS: Kann man eigentlich "fertige" Scripten wo posten, so daß sich jemand Gedanken darüber machen kann, was man alles vergessen hat?

thommy
21-09-2000, 08:34
Ich habe einen kleinen Fehler gemacht...
Ist nämlich keine Datei im Verzeichnis vorhanden, so expandiert $(ls) zu "Nichts" und "set" gibt die Liste aller Shellvariablen aus. Das ist nicht ganz das, was wir erwarten. Als Lösung bietet sich das schon von Dir beschriebene "for i in $(ls)..." an oder Folgendes:

<code>set ""$(ls)<code> #### OHNE "="!!!
<code>shift 1</code>
<code> for i do...</code>

Hier wird die Liste "künstlich" verlängert, "set" wird somit niemals die Liste der Variablen ausgeben. Mit "shift 1" überspringen wir das erste Element (die leere Zeichenkette).

Und im Anschluss gleich ein nettes Skript "Übungen zur Shellprogrammierung Teil 2" http://www.linuxforen.de/ubb/wink.gif:

<pre>
#!/bin/sh

cd ${1:-./}
declare -i number=0

for i in $(ls)
do
if test -d $i
then
$0 $i
else
number=number+1
fi
done
echo "Verzeichnis: $(pwd) enthaelt $number Dateien"
</pre>

Das Skript muss mit vollständiger Pfadangabe gerufen werden! Viel Spaß beim Knobeln http://www.linuxforen.de/ubb/wink.gif

Thomas

[Dieser Beitrag wurde von thommy am 21. September 2000 editiert.]

[Dieser Beitrag wurde von thommy am 21. September 2000 editiert.]

pitu
21-09-2000, 10:33
In der Shell gibt es viele Möglichkeiten, das gleiche zu erreichen.
Ich mag vollgendes Konstrukt sehr gerne:

<pre>
LISTE=`ls /ver/zeich/niss`


for i in $LISTE; do
echo $i
done
</pre>

Diese Konstrukt hat den Vorteil, das du dich nicht explizit in diesem Pfad befinden musst. Ausserdem kann man $LISTE dann auch gleich weiterverwenden.

Gerne mag ich es, die Einstellungen von aussen, oder am Anfang einzustellen, damit ich weiter weiter nix machen muss.

z.B.
<pre>
DIR="$HOME"
LS_OPT="-A"


source $HOME/.mein.script.rc


test "$1" = "-d" && DIR="$2"
test "$3" = "-d" && DIR="$4"
test "$1" = "-o" && LS_OPT="$2"
test "$3" = "-o" && LS_OPT="$4"

LISTE="ls $LS_OPT $DIR"


for i in $LISTE; do
echo $i
done
</pre>

Dies bedeutet beispielsweise, das ich Einstellungen im Script selber habe, die ich jederzeit im Script ändern kann. Wenn ich nun in meinem Home eine Datei .mein.script.rc habe, dann kann ich dort die Variablen DIR und LS_OPT neu definieren.
Mit Komandozeilenoptionen kann ich die Variablen nochmal verändern.

Das script wir dadurch übersichtlicher als:
<pre>
for in in $(ls bla böub sonstwas); do
echo $i
done
</pre>

Aber das ist jedem seinen eigenen Stil überlassen.

thorsten

------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg

pitu
21-09-2000, 10:34
thommy: wie kriegst du im (pre) leerzeilen hin?

thorsten

------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg

thommy
21-09-2000, 11:11
Hallo Thorsten,

so richtig bin ich auch noch nicht hinter zulässige und unterdrückte Formatierungsbefehle gestiegen... (früher ließ sich sogar mal Text &lt;b&gt;fett&lt;/b&gt; drucken, jetzt nicht mehr???)

Eine zusätzliche Leerzeile ist wohl nur über die Aufteilung des Textes in zwei &lt;pre&gt;&lt;/pre&gt;-Formatierungen möglich, mehrere &lt;br&gt; werden leider unterdrückt...

Grüße Thomas