• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script aber keine ahnung, wo mein fehler ist

:roll:
guten abend.
und zwar habe ich folgendes problem, ich habe einen ordner , in diesem befindet sich die datei nemen.txt dazu soll ich nun ein script machen, welches die namen alphabetisch ordnet, meinen namen ausgibt, die aktuelle uhrzeit und datum und die zeilenanzahl soll gezählt und ausgegeben werden. aber irgendwie klappt das nicht so bei mir und da ich davon niht viel verstehe, weiß0 ich nicht mehr weiter.
könnte mir bitte jemand helfen? frage ist auch noch, wie bekomm ich das hin, dass er auch die namen.txt nimmt und nicht einfach aufhört????
danke schon mal im voraus :wink:

bisher ins shellscript geschrieben:

+1 #!/bin/bash
+2 echo Parameter
+3 echo Anzahl Parameter: $#
+4 i=0
+5 if test $# -ne 1
+6 then echo Bitte geben Sie einen Dateinamen an!
+7 fi
+8 if test -d $1; then echo $1 ist ein Verzeichnis;fi
+9 if [ -f $1 ]
+10 then if [ -s $1 ]
+11 then echo $1 existiert und ist nicht leer
+12 fi
+13 fi
+14 if test \( -f$1\]-a\(-s$1\); then echo $1 existiert und ist nicht leer;fi
+15 echo Datei wird ausgelesen...
+16 exec <$1 tempdatei
+17 echo "mein name"
+18 set `date`
+19 echo Datum: $2.$3 $5
+20 echo
+21 read zeile
+22 while test "$zeile"
+23 do
+24 set $zeile
+25 i=`expr §a +1`
+26 echo " $1 $3 "
+27 read zeile
+28 done
+29 echo Es sind §i Namen in der Liste vorhanden.
+30 echo
+31 sort tempdatei
+32 rm tempdatei
 
Hallo

Ich wage mal einen Versuch:

Also:


+1 #!/bin/bash
#es empfiehlt sich hier in der Testphase set -x einzusetzen um
# brauchbare Fehlermeldungen zu bekommen

#setze sämtliche echos in DoubleQuotes
+2 echo Parameter
#zB echo "Anzahl Parameter: $#"
+3 echo Anzahl Parameter: $#
+4 i=0
+5 if test $# -ne 1
+6 then echo Bitte geben Sie einen Dateinamen an!
+7 fi
+8 if test -d $1; then echo $1 ist ein Verzeichnis;fi
+9 if [ -f $1 ]
+10 then if [ -s $1 ]
+11 then echo $1 existiert und ist nicht leer
+12 fi
+13 fi
+14 if test \( -f$1\]-a\(-s$1\); then echo $1 existiert und ist nicht leer;fi
+15 echo Datei wird ausgelesen...
+16 exec <$1 tempdatei
+17 echo "mein name"
+18 set `date`

#Wo sollen eigentlich diese Variablen herkommen? $2.$3 $5
#verwechselst du da was mit awk ?
#oder steh ich jetzt auf der Leitung?
+19 echo Datum: $2.$3 $5
+20 echo
+21 read zeile
+22 while test "$zeile"
+23 do
+24 set $zeile

#muss da nicht $a stehen?
+25 i=`expr §a +1`
+26 echo " $1 $3 "
+27 read zeile
+28 done

#$i?
#Ausserdem ist mir aufgefallen das dieses "in" im Text hervorgehoben
#ist , wenn man das Script in kwrite betrachtet. Also wieder.
#alle echo in "" setzen. Damit vermeidest du unter anderem das
#bestimmte Ausdrücke von der Shell fehlinterperetiert werden.
+29 echo Es sind §i Namen in der Liste vorhanden.
+30 echo
+31 sort tempdatei
+32 rm tempdatei
#wenn du am Anfang vom Script set -x eingesetzt hast, dann musst du hier mit set +x stoppen.

Also alles in allem bin ich an manchen Stellen überfragt. Ist doch immer wieder interessant wieviel Möglichkeiten es gibt einen bestimmten Zweck zu erfüllen.

Aber lass das Script einfach mal mit
set -x

set +x
laufen . dann kann man besser nachvollziehen was passiert.

Gruß Peter
 
P.S.:

Code:
+18 set `date` 
 +19 echo Datum: $2.$3 $5

Warum verwendest du nicht:

echo "Datum: `date +'%d.%m.%Y'`"

ergibt folgendes:
Datum: 10.01.2008


Gruß Peter
 
trommelpeter schrieb:
Warum verwendest du nicht:

echo "Datum: `date +'%d.%m.%Y'`"
Warum nicht gleich:
Code:
date "+Datum: +%d.%m.%Y"

Aber OK, das ist vielleicht nebensächlich...

Wie suga2001 richtig erkannt hat, sortiert man mit sort. Mit ein paar anderen Befehlen kombiniert, hat man viele Möglichkeiten:
Code:
# Anzahl der Zeilen in namen.txt
wc -l namen.txt

# Anzahl der Zeilen (ohne doppelte)
sort -u namen.txt | wc -l

# namen.txt sortieren und in die Datei zurückschreiben
sort namen.txt > tempdatei && mv tempdatei namen.txt

suga2001 schrieb:
if test $# -ne 1
then echo Bitte geben Sie einen Dateinamen an!
fi
Hinweis: Wenn hier im Falle dieser Meldung ein Abbruch geschehen soll, muss man noch ein exit rein schreiben oder den restlichen Code in den else-Zweig schreiben...
 
trommelpeter schrieb:
#Wo sollen eigentlich diese Variablen herkommen? $2.$3 $5
#verwechselst du da was mit awk ?
#oder steh ich jetzt auf der Leitung?
Das ist kein awk. Der Inhalt kommt von daher:
Code:
set `date`

Oder probiere folgendes aus:
Code:
prompt> set a b c
prompt> echo $3
c
prompt>
 
@ trommelpeter und die anderen :)

erst mal dickes danke, dass du dich meinem problem so intensiv gewidmet hast.

Wo sollen eigentlich diese Variablen herkommen? $2.$3 $5
das sind bestimmte zeilen aus dem namen.txt, denke ich, oder hab ich da auch wieder mist gebaut? aber wenn du das (echo Datum: $2.$3 $5) meintest, dachte ich, dass ich damit die nötigen datumsangaben anspreche und ausgebe. ich soll nachher ausgeben, wieviele zeilen die temp hat, nicht die namen.txt. aber nun weiß ich immer noch nicht, wie ich mit dem shellscript auf die namen.txt anspringe. wenn ich ein exit setzte, verlässt er alles und schließt sogar die konsole, deswegen hab ichs wieder rausgenommen. :?


so siehts jetzt aus: :roll:


+1 set -x
+2 #!/bin/bash
+3 "echo" Parameter
+4 "echo" Anzahl Parameter: $#
+5 i=0
+6 if test $# -ne 1
+7 then "echo" Bitte geben Sie einen Dateinamen an!
+8 fi
+9 if test -d $1; then "echo" $1 ist ein Verzeichnis;fi
+10 if [ -f $1 ]
+11 then if [ -s $1 ]
+12 then "echo" $1 existiert und ist nicht leer
+13 fi
+14 fi
+15 if test \( -f$1\]-a\(-s$1\); then "echo" $1 existiert und ist nicht leer;fi
+16 "echo" Datei wird ausgelesen...
+17 exec <$1 tempdatei
+18 "echo" "mein name"
+19 set `date`
+20 "echo" "Datum: `date +'%d.%m.%Y'`"
+21 "echo"
+22 read zeile
+23 while test "$zeile"
+24 do
+25 set $zeile
+26 i=`expr $a +1`
+27 "echo" " $1 $3 "
+28 read zeile
+29 done
+30 "echo" Es sind §i Namen in der Liste vorhanden.
+31 "echo"
+32 sort tempdatei
+33 rm tempdatei
+34 set +x
 
hallo suga2001

Kannst du mir das Script mal zusenden?
Da gibt es noch bisschen mehr zu korrigieren.
bis ich mich da mit erklären durchwurstle glaube ich habe ich das selber schon längst zurechtgetüftelt.

Aber was ich unbedingt bräuchte ist eine genaue Erklärung was du eigentlich vorhast. Ich habe nämlich den Zweck des Scriptes ehrlich gesagt noch überhaupt nicht durchschaut.

Gruß Peter
 
suga2001 schrieb:
ich soll nachher ausgeben, wieviele zeilen die temp hat, nicht die namen.txt.
Schon mal meinen Vorschlag mit wc -l ausprobiert?
aber nun weiß ich immer noch nicht, wie ich mit dem shellscript auf die namen.txt anspringe.
Wenn ich dich richtig verstehe willst du doch den Dateinamen als ersten Parameter mitgeben. Dann speicher $1 am Anfang des Scriptes in irgendeine andere Variable und verwende diese.
wenn ich ein exit setzte, verlässt er alles und schließt sogar die konsole, deswegen hab ichs wieder rausgenommen. :?
Wie rufst du denn das Script auf?
Das exit sollte eigentlich schon drinbleiben. Du willst doch, dass das Script bei einer fehlerhaften Eingabe abbricht und nicht einfach weitermacht. Das sieht etwa so aus:
Code:
if test $# -ne 1 
then "echo" Bitte geben Sie einen Dateinamen an! 
  exit 1
fi
 
da liegt auch schon der hase im pfeffer. ich hab zuhause kein linux/suse. ich muss das für die uni machen und bin da noch nicht so durchgestiegen, weil nun schon nach mehreren anläufen nicht geklappt hat. das script habe ich nur als txt mit den befehlen, wie schon gepostet. habs schon paar mal geschrieben und ausgeführt, aber geklappt hats nicht. deswegen wende ich mich ja verzweifelt an ein linux board.

ich glaube, dass ich das shellscript starte, in dem ich in dem ordner bin, wo die namen.txt liegt und das script und ich gebe ein $. script4 (so heisst das ding bei mir)
aufgabe ist:

im verzeichnis /tmp/besy5_beispiele auf power1 befindet sich eine textdatei namen.txt, die namen, vornamen, login-kennung und uid zeilenweise enthalten. schreiben sie ein shellscript, dass die datei zeilenweise ausliest und eine ausgabe erzeugt, die nur den nachnamen und die login-kennung enthählt, alphabetisch sortiert nach namen. übergeben sie den dateinamen in der kommandozeile. prüfen sie, dass genau ein dateiname als parameter angegeben wurde.
Zählen sie die anzahl der namen. geben sie ihren namen und das aktuelle datum(ohne uhrzeit) zu beginn aus! kopieren sie das ausführbare script unter ihrer login-kennung in das verzeichnis /tmp/besy5 auf power1 :?:
 
suga2001 schrieb:
da liegt auch schon der hase im pfeffer. ich hab zuhause kein linux/suse.
Dann wird es aber Zeit ... :wink:
Mit eine Linux/Unix-Installation wird für gewöhnlich eine umfangreiche Dokumentation mitgeliefert. Das nennt sich man-pages und ist zum Einarbeiten sehr nützlich. Ich komme unten nochmal darauf zurück...

wo die namen.txt liegt und das script und ich gebe ein $. script4 (so heisst das ding bei mir)
Frage: Ist der Punkt ein Teil deines Prompts, oder rufst du dein script mit ". " (also Punkt + Blank) auf? Falls letzteres, dann ist es kein Wunder, dass ein exit die Shell beendet. Empfehlung: Falls es nicht zwingende Gründe gibt: ohne Punkt+Blank aufrufen. Für weiterführende Infos siehe dazu "man bash" und dort das Thema "SHELL BUILTIN COMMMANDS".

aufgabe ist: [...]
Erwarte bitte nicht, dass wir dir hier eine 100% fertige Lösung ausarbeiten. Das ist sicher auch nicht der Sinn der Sache. Mit konkreten Fragen hilft man dir wahrscheinlich eher weiter...

Aber grundsätzlich bist du schon auf dem richtigen Weg...
 
nein, das erwarte ich nicht. ich soll damit ja klar kommen, bzw es verstehen, aber am verständnis hapert es gewaltig. das einzige, was ich kenne ist der pingiun? oder pring ich was durcheinander? gehört der salamder zu linuk? :?: mhhhhhh
problem ist, wenn ich das skript starte, ohne blanko $.script4 ( :) ) spukt er mich nichts gescheites aus als meinen namen und das datum, aber immerhin stimmt das schon.... :? er soll sich aber die namen.txt nehmen und nach zeilen durchsuchen und das denn in die temp ausgeben. da liegt das problem, wie bekomm ich das hin, dass er die namen.txt anspricht und diese auch durchsucht????
 
Hallo suga2001

Irgendwie bin ich auf den Geschmack gekommen.
Ich hätte schon Lust an der Aufgabe zu tüfteln. Nur einen Kurs kann ich dir leider nicht geben.
Das Thema ist zu komplex um es in einem Thread zu behandeln.
Ich musste mir ein Buch mit 736 Seiten kaufen um halbwegs in die Materie reinzukommen. Und was ich gerade mal mit Müh und Not nach 400 Seiten verstanden habe kann ich nicht in einem Thread vermitteln.

Aber mein Angebot steht. Schick mir das Material zu, das zu deiner Hausaufgabe gehört und dann probiere ich mal mein Glück.
So wie ich das verstanden habe müsste man hier evtl mit awk arbeiten.

Ein 36 Seiten langes Kapitel zu awk habe ich vor kurzen erst durchgelesen. Mal schauen was ich davon wirklich kapiert habe :D


Gruß Peter
 
suga2001 schrieb:
problem ist, wenn ich das skript starte, ohne blanko $.script4 ( :) ) spukt er mich nichts gescheites aus als meinen namen und das datum, aber immerhin stimmt das schon.... :?
Laut Aufgabenstellung soll man doch die Datei "namen.txt" dem Script als Parameter mitgeben.

In deinem Fall lautet der der korrekte Aufruf also:
Code:
script4 "/tmp/besy5_beispiele/namen.txt"

Dann sollst du prüfen, ob genau eine Datei als Parameter mitgegeben wurde. Das machst du ja bereits mit dem if-Zweig, der $# abfrägt. In diesen sollst du denke ich nun das exit wie von mir vorgeschlagen einbauen, damit das Script abbricht, falls kein Dateiname als Parameter mitgegeben wurde.

Nach dieser Plausi-Prüfungen schreibst du den Parameter (mit dem Dateinamen als inhalt in eine Variable. Das macht man so:
Code:
datei=$1
Das musst du deswegen machen, weil du weiter unten im Code $1 wieder überschreibst (nämlich mit dem Befehl set).

So, nun zum sortieren. Wie bereits gesagt wird mit dem Befehl sort sortiert. Also:
Code:
sort "$datei"
Dem sort kann man Parameter mitgeben, nach welche Spalte er sortieren soll. Siehe hierzu man sort

Ich weiß nicht genau wie die Datei namen.txt aufgebaut ist. Hat sie einen Delimiter (z.B. Semikolon)? Wenn ja, könnte man mit dem Befehl cut arbeiten. Anstonsten kann man grundsätzlich die Ausgabe des Sorts gleich verwenden, um eine Lese-Schleife zu starten.
Code:
sort "$datei" | while read zeile
do
  echo zeile: $zeile
done

So erstmal bis hierher...
 
Hallo suga2001

Irgendwie bin ich auf den Geschmack gekommen.
Ich hätte schon Lust an der Aufgabe zu tüfteln. Nur einen Kurs kann ich dir leider nicht geben.
Das Thema ist zu komplex um es in einem Thread zu behandeln.
Ich musste mir ein Buch mit 736 Seiten kaufen um halbwegs in die Materie reinzukommen. Und was ich gerade mal mit Müh und Not nach 400 Seiten verstanden habe kann ich nicht in einem Thread vermitteln.

Aber mein Angebot steht. Schick mir das Material zu, das zu deiner Hausaufgabe gehört und dann probiere ich mal mein Glück.
So wie ich das verstanden habe müsste man hier evtl mit awk arbeiten.

Ein 36 Seiten langes Kapitel zu awk habe ich vor kurzen erst durchgelesen. Mal schauen was ich davon wirklich kapiert habe :D


Gruß Peter
 
na toll, was gibt die uns erstsemis denn für aufgaben? * :roll: * kann ja noch heiter werden. aber wie soll ich das schicken? ich hab die aufgabe so bekommen und soll das suse inne uni nehmen, dafür muss ich aber ins labor. deswegen wollte ichs inner txt datei schreiben und nachher nur noch in der uni ne shell machen. dachte, das wäre so einfach .... :?:
aber danke peter und notoxp
 
bash sagt mir was, aber awk nicht, da is es ganz dunkel, aber was is denn ne bash? scheint wohl zum shell zugehören?
 
Hallo suga2001


https://shop.linuxnewmedia.de/Produkte/Bestellen/os_spezial_2008_1.html
Ich empfehle dir dringend dieses Heft. Es handelt nicht nur über die Shell , sondern enthält auch noch eine openSuSE 10.3 Live-CD.

Damit kannst du deine Hausaufgaben zuhause machen ohne das du Linux installieren musst.

http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/bash.html
http://wiki.linux-club.de/Shell
Auch diese beiden Links wären wenigstens mal wert zu überfliegen.

Mehr kann ich leider im Moment nicht tun. Ich bin selber leider noch nicht so fit das ich dir sämtliche Antworten aus dem Ärmel schütteln kann.
Ich bin selber leider noch ein sogenannter "Newbie" :)

Aber ich bin mir sicher, das, wenn ich das Material für die Hausaufgabe vor mir hätte, dann könnte ich schon was zurechttüfteln.

Mir ist das ganz Thema im Moment leider noch zu abstrakt, mangels Anschauungsmaterial.

Gruß Peter
 
Oben