PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellskript: Frage zu for



ContainerDriver
30-01-2004, 14:24
Hi,
ich versuche mich im Moment in Shell-Programmierung. Nun habe ich folgende Frage:
Wie kann man festellen, wann das letzte Element in einer for-Schleife erreicht ist (wenn man sich noch in der
Schleife befindet, und man nicht weiß, wie oft sie durchlaufen wird)?
Ich habe mir nämlich ein kleines Skript geschrieben, das Verzeichnisse rekursiv durchläuft. Die Ausgabe erfolgt in
Baumform, was dann so aussieht:


#..............
|-+ 'The Strokes'
| |-+ 'Is This It'
| | |-- 'The Strokes - 01.ogg'
| | |-- 'The Strokes - 02.ogg'
| | |-- 'The Strokes - 03.ogg'
| | |-- 'The Strokes - 04.ogg'
| | |-- 'Titel 05.ogg'
| | |-- 'Titel 06.ogg'
| | |-- 'Titel 07.ogg'
| | |-- 'Titel 08.ogg'
| | |-- 'Titel 09.ogg'
| | |-- 'Titel 10.ogg'
| | |-- 'Titel 11.ogg'
| |#HIER LIEGT DAS PROBLEM (die ganze 3. Spalte hoch)
|
|-+ 'the vines'
#..............

An der markierten Stelle seht ihr das Problem: Der Unterbaum ist schon zu Ende, doch das "|" wird immer noch
ausgegeben!
Hier der Code:



depth=-2
files=0
dirs=0
IFS="
"
#ifs = \n

put_out_space()
{
temp=$@
while [ $temp -gt 0 ]
do
if [ `expr $temp % 2` = 0 ]
then
echo -n "|"
else
echo -n " ";
fi
temp=`expr $temp - 1`
done
}

parse_dir()
{
items=`ls -1`
depth=`expr $depth + 2`
for DIR in $items; do
put_out_space $depth
if [ -d $DIR ]
then
echo "|-+ '$DIR'"
dirs=`expr $dirs + 1`
cd $DIR
parse_dir
put_out_space $depth
echo "|"
cd ".."
else
echo "|-- '$DIR'"
files=`expr $files + 1`
fi

done
depth=`expr $depth - 2`
}

cd "/home/florian/music"
parse_dir

echo "$files Files, $dirs Directories"


Wäre schön wenn ihr mir helfen könntet!

MfG
Florian

fork
30-01-2004, 16:10
if [ -d $DIR ]
then
echo "|-+ '$DIR'"
dirs=`expr $dirs + 1`
cd $DIR
parse_dir
put_out_space $depth
echo "|"
cd ".."
else
echo "|-- '$DIR'"
files=`expr $files + 1`
fi

Nach einem Verzeichnis gibst Du direkt noch ein "|" aus ohne zu testen ob es noch ein Element gibt.

Ansonsten macht deine Funktion put_out_space immer Striche, ob nach dem Verzeichnis noch ein weiteres Element kommt oder nicht.

Kannst Dir ja mal von Anregungen Steve Baker's tree holen.
http://mama.indstate.edu/users/ice/progs.html

ContainerDriver
30-01-2004, 16:34
Danke, aber das wusste ich ja schon.
Die Frage ist ja:

Wie kann man festellen, wann das letzte Element in einer for-Schleife erreicht ist (wenn man sich noch in der
Schleife befindet, und man nicht weiß, wie oft sie durchlaufen wird)?

MfG

Florian