Shell Skript Problem

Hallo,

ich bin gerade dabei mich mit Linux zu beschäftigen und habe zwei Aufgaben bekommen,
bei denen ich ein bisschen Hilfe brauche.
Ist wahrscheinlich für jemanden der sich mit Linux auskennt ziemlich einfach,aber ich
bin halt Neuling!
Also,

  1. Im Unterverzeichnis „~/linutest“ befindet sich die Datei „da1“ und
    im Verzeichnis „~/linutest/unt_1“ befindet sich die Datei „da2“.
    Ein Shell Skript mit Namen „tausch“ soll geschrieben werden, das
    die datei „da1“ unter dem Namen „da2“ ins Unterverzeichnis „unt_1“
    überträgt und die Datei „da2“ unter dem Namen „da1“ in das
    Unterverzeichnis „linutest“
    Wenn man das Shell Skript ein zweites Mal startet, soll der Tausch
    rückgängig gemacht werden.
    Das ist ja noch realtiv einfach aber ich muss mich an folgende
    Bedingungen halten:
  • das Skript darf höchstens aus zwei cp-Befehlen, einem rm-Befehl
    und einem mv-Befehl bestehen
  • der erste Befehl kopiert die Datei „da2“ aus dem Unterverzeichnis
    „unt_1“ ins Unterverzeichnis „linutest“
  • das Skript wird in „~/linutest“ gespeichert
  • das Skript muss auch dann funktionsfähig sein, wenn man es
    von einem beliebigen anderen Verzeichnis aus aufrufen will

Eine kürzere Lösung ist auch zulässig, aber man muss sich an diese Bedingungen halten.

  1. Ein Shell Skript schreiben, mit dem Namen „tau_te“, welches die
    Inhalte der Dateien kontrolliert.
    Das Shell Skript soll folgende Texte auf den Schirm schreiben:

Vor dem Tausch:
Inhalt von da1:
Text der Datei da1
Inhalt von da2:
Text der Datei da2

Nach dem Tausch:
Inhalt von da1:
Text der Datei da2
Inhalt von da2:
Text der Datei da1

Der erste und der letzte Befehl in diesem Skript soll jeweils „echo“ lauten und das Skript soll aus insgesamt 6 Befehlen bestehen, also:

  1. Befehl=echo
  2. Befehl=
  3. Befehl=
  4. Befehl=
  5. Befehl=
  6. Befehl=echo

Ich hoffe ich habe mich einigermaßen klar ausgedrückt und ihr könnt mir weiterhelfen.

Vielen Dank schonmal im vorraus!

Gruß

Hallo,

Hi,

ich bin gerade dabei mich mit Linux zu beschäftigen und habe
zwei Aufgaben bekommen,
bei denen ich ein bisschen Hilfe brauche.
Ist wahrscheinlich für jemanden der sich mit Linux auskennt
ziemlich einfach,aber ich
bin halt Neuling!
Also,

  1. [snip]
    folgende Bedingungen halten:
    [snip]

Hm… ja, geht. Wie sehen denn Deine bisherigen Loesungsversuche aus?

  1. [snip]

  2. Befehl=echo

  3. Befehl=

  4. Befehl=

  5. Befehl=

  6. Befehl=

  7. Befehl=echo

Hm, mueszte auch gehen. Deine konkreten Ideen waren bislang?

Ich hoffe ich habe mich einigermaßen klar ausgedrückt und ihr
könnt mir weiterhelfen.

Oh, ja. Sehr sogar. Fuer welches Fach sind die Hausaufgaben?

Gruss vom Frank.

Tach,

als Mac-User und damit ewigem Computerblondchen würde ich es mit der
eintastigen Maus oder mit zwei cp und einem mv machen. Das übrig
gebliebene rm würde ich aufheben und es mal zukünftig irgendwo benutzen.

Stefan

Hi.
Eigene Lösungsvorschläge habe ich bis jetzt noch nicht. Habe alle anderen Aufgaben selbst machen können,aber hier hänge ich irgendwie fest.
Ich mache ein Fernstudium zum Web-Master, ist kurz vor der Vollendung und beschäftige mich jetzt mit Linux.
Hast Du schon irgendwelche Lösungsvorschläge?

Gruß

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi.

Hallo,

Eigene Lösungsvorschläge habe ich bis jetzt noch nicht.

Schade.

Habe alle anderen Aufgaben selbst machen können,

Fein.

aber hier hänge ich irgendwie fest.

Hm. Woran denn konkret? Du solltest versuchen, das Gesamtproblem in atomare Teilprobleme aufzuteilen. Falls Du mit einem davon Schwierigkeiten hast, die Du durch Lektuere der manpages zu den erwaehnten Befehlen nicht loesen kannst, bist Du hier wieder willkommen.

Ich mache ein Fernstudium zum Web-Master, ist kurz vor der
Vollendung und beschäftige mich jetzt mit Linux.

Ich weisz zwar nicht genau, was ein webmaster ist, aber IMHO ist die Reihenfolge sehr komisch. Was habt ihr denn bis jetzt gemacht? (Buah, ich will auch webmaster werden!)

Hast Du schon irgendwelche Lösungsvorschläge?

Ein paar Hinweise zum Dateitausch:

  1. cp (copy) kopiert Dateien. Als Argument werden (mindestens) zwei Namen benoetigt. Ist der zweite Name eine Datei wird die Datei mit dem ersten Namen ueber die mit dem zweiten Namen geschrieben. Ist der zweite Name ein Pfad wird die Datei mit dem ersten Namen ohne Veraenderung des Dateinamens in diesen Pfad geschrieben. Die Namen koennen dabei immer absolute und relative Pfade enthalten.
  2. mv (move) verschiebt Dateien und funktioniert genauso wie das cp, nur das die erste Datei entfernt wird. Verschieben und umbennenen ist das gleiche.
  3. rm (remove) loescht die als Argument uebergebenen Dateien und ist eigentlich hier ueberfluessig, wenn Du es trotzdem brauchst, keine Hemmungen.
  4. Die ~ steht fuer das home-Verzeichnis des users und expandiert immer zu einem absoluten Pfad, ist also auf einer Unix-Maschine immer eindeutig.
  5. Tauschen rueckgaengig machen ist aequivalent zum nochmaligen Tauschen.

Zusammen mit den Hinweisen, wie das script anfangen musz, sollte das jetzt eigentlich kein Problem sein. Fang einfach mal was an und komme mit Deinen Ideen her. (Ich hoffe, Du hast irgendwo eine Unix/Linux-Maschine, damit Du rumprobieren kannst. Ansonsten sei Dir cygwin[1] empfohlen.)

Die zweite hab ich entweder grundlegend falsch verstanden, ist wahnsinnig kompliziert oder ich habe mich in eine total falsche Richtung verrannt. (Ich hoffe ersteres, befuerchte letzeres.) Um mal zusammenzufassen, wie ich die Aufgabe verstanden hab:

  1. Den Text ‚Vor dem Tausch:‘ ausgeben.

  2. Den Text ‚Inhalt von da1:‘ ausgeben.

  3. Den Inhalt der Datei da1 ausgeben.

  4. Den Text ‚Inhalt von da2:‘ ausgeben.

  5. Den Inhalt der Datei da1 ausgeben.

  6. Eine Leerzeile ausgeben.

  7. Die Datei tauschen.

  8. Den Text ‚Nach dem Tausch:‘ ausgeben.

  9. Den Text ‚Inhalt von da1:‘ ausgeben.

  10. Den Inhalt der neuen, getauschten Datei da1 ausgeben.

  11. Den Text ‚Inhalt von da2:‘ ausgeben.

  12. Den Inhalt der neuen, getauschten Datei da2 ausgeben.
    Das ist IMHO fuer sechs Zeilen ganz schoen viel, zumal die erste und letzte Zeile schon mit einem echo am Anfang festgeklopft ist. Es mueszen mindestens vier Dateiausgaben gemacht werden (vier Zeilen) und immer zwischendurch Textmeldungen (nochmal vier Zeilen, wobei sich die Meldungen zusammenfassen lassen. Meine zwei kreativsten Vorschlaege sind:

    echo -e „Vor dem Tausch:\nInhalt von da1:\ncat ~/linutest/da1\nInhalt von da2\ncat ~/linutest/unt_1/da2\n“
    ~/linutest/tausch
    echo -e „Nach dem Tausch:\nInhalt von da1:\ncat ~/linutest/da1\nInhalt von da2\ncat ~/linutest/unt_1/da2

    echo -n

und

echo "`for i in Vor Nach
do echo -e \"$i dem Tausch:\"
sed \"1iInhalt von da1:\" ~/linutest/da1 ~/linutest/unt\_1/da2 |sed \"\`wc -l ~/linutest/da1 |awk '{print $1+2}'\`iInhalt von da2:\"
test $i = \"Vor\" && ~/linutest/tausch
done`"
echo -n

Wobei der aufmerksame Leser bemerken wird, dasz die zweite Version die Leerzeile zwischendurch weglaeszt, was aber auch trivial nachzureichen waere, und ich den Begriff Befehl groszzuegig als Zeile ausgelegt hab. In anderen Varianten fasse ich den Begriff strenger auf, erzeuge und kompiliere dafuer aber C-Programme oder bastle kurze perl-Einzeiler zusammen. Die erfuellen zwar die engen Rahmenvorgaben, sind aber dermaszen sinnlos kompliziert, dasz ich mir nicht vorstellen kann, dasz das die gewuenschte Loesung sein soll. Also, sag Du mir mal, was ich falsch verstanden hab.

Gruss vom Frank.
P.S.: Weitere kreative Ideen anderer Mitleser faende ich auch sehr interessant.
===footnotes===
[1] http://www.cygwin.com/

1 Like

Also, sag Du mir mal, was ich falsch verstanden hab.

Du sollst zwei Dateien kopieren und eine umbenennen und nicht mit sed
herumhampeln :wink:

Wie schreibt Frank Dielmann so schön:

Vor dem Tausch:
Inhalt von da1:
Text der Datei da1
Inhalt von da2:
Text der Datei da2

Nach dem Tausch:
Inhalt von da1:
Text der Datei da2
Inhalt von da2:
Text der Datei da1

Das heißt für mich, dass da1 von da2 überschrieben wird und vice versa. Dann
noch ein bisschen echoen und fertig ist die Laube. Kreativer kann ich nicht.
Ich bin ja nicht einmal kreativ genug, um deine Programmierung zu verstehen,
was wahrscheinlich daran liegt das sed mich hasst.

Stefan

Hi.
also ich habe mir mal Gedanken gemacht,aber ich bin auch nicht viel schlauer geworden. Wenn ich als erstes die Datei „da2“ nach „unt1“ kopieren muss, ist das ja weiter kein Problem, ich kann dieser Datei aber nicht sofort einen neuen Namen geben,weil dieser ja bereits in diesem Verzeichnis exestiert.Also muß ich ohne Namensenderung kopieren,die andere Datei kann ich ja einfach „moven“. Kann ich dabei eigentlich den Namen ändern? Wenn ja, würde es ja gehen, dann könnte ich die Datei „da1“ moven und die Datei „da2“ könnte ich insselbe Verzeichnis mit der Namensenderung reinkopieren und die Ursprungsdatei mit „rm“ löschen. Ginge das?? Das ist aber ziemlich kompliziert und ich bin mir sicher,dass Du einen einfacheren Weg weißt,oder?
Im Prinzip wäre das tauschen ja kein Problem,wenn ich mich nicht an
diese bekloppten Bedingungen halten müsste.

Bei der zweiten bin ich nicht weiter gekommen.
Also das,was ausgegeben werden soll, werde ich mal in Anführungsstriche schreiben.

Vor dem Tausch:
"Inhalt von da1:
Text der Datei da1
Inhalt von da2:
Text der Datei da2
"

Nach dem Tausch:
" Inhalt von da1:
Text der Datei da2
Inhalt von da2:
Text der Datei da1
"

Hi.

Hallo,

also ich habe mir mal Gedanken gemacht,aber ich bin auch nicht
viel schlauer geworden.

Doch.

Wenn ich als erstes die Datei „da2“ nach „unt1“ kopieren muss,
ist das ja weiter kein Problem, ich kann dieser Datei aber nicht
sofort einen neuen Namen geben,weil dieser ja bereits in diesem
Verzeichnis exestiert.

Richtig (bis auf die Rechtschreibung).

Also muß ich ohne Namensenderung kopieren,die andere
Datei kann ich ja einfach „moven“.

Das kannst Du machen, solltest Du aber nicht. Du hast die erste Datei ohne Namensaenderung kopiert, also muszt Du sie irgendwann nochmal umbenennen. Genau dafuer wuerde ich mir das mv aufheben.

Kann ich dabei eigentlich den Namen ändern?

Ja.

Wenn ja, würde es ja gehen, dann könnte ich die Datei „da1“
moven und die Datei „da2“ könnte ich insselbe Verzeichnis
mit der Namensenderung reinkopieren und die Ursprungsdatei mit
„rm“ löschen. Ginge das??

Bingo! Geht doch. Jetzt schreibst Du das nochmal schick auf und kriegst ein Bienchen.

Das ist aber ziemlich kompliziert und ich bin mir sicher,dass Du
einen einfacheren Weg weißt,oder?

Ja. Ich wuerde das rm behalten (cp und mv koennen Dateien ueberschreiben, was auch eine Art Loeschen ist) und es dem Stefan schenken, weil der da beduerftig ist. Vorher mueszte ich es natuerlich als alias auf ‚r‘ legen, weil der mit zwei Tasten sowieso ueberfordert ist, und dem Buchstaben ein schickes design mit Weisz und transparentem Tuerkis verpassen.

Im Prinzip wäre das tauschen ja kein Problem,wenn ich mich
nicht an diese bekloppten Bedingungen halten müsste.

Ich stimme Dir zu, dasz die Bedingungen bekloppt sind. Wahrscheinlich ist der effiziente Umgang mit shell-tools Sinn der Uebung.

Bei der zweiten bin ich nicht weiter gekommen.

Ausgabe von Texten geht mit echo. Den Inhalt von Dateien gibt man mit cat aus. Das oben geschriebene script solltest Du wiederverwenden.

Also das,was ausgegeben werden soll, werde ich mal in
Anführungsstriche schreiben.

Vor dem Tausch:
"Inhalt von da1:
Text der Datei da1
Inhalt von da2:
Text der Datei da2
"

Das sind vier Befehle, der erste faengt mit dem vorgegebenen echo an. Nach den Ausgaben muessen die Dateien getauscht werden (+1 Befehl).

Nach dem Tausch:
" Inhalt von da1:
Text der Datei da2
Inhalt von da2:
Text der Datei da1
"

Wieder vier Befehle, der letzte beginnt cat. Mit dem als Bedingung vorgebebenen echo noch einer. Ich zaehle insgesamt 10. Die Aufgabe ist IMHO mit einem script-Aufruf so (auf einfache Art) nicht loesbar.

Gruss vom Frank.

Vorher mueszte
ich es natuerlich als alias auf ‚r‘ legen, weil der mit zwei
Tasten sowieso ueberfordert ist, und dem Buchstaben ein
schickes design mit Weisz und transparentem Tuerkis verpassen.

Yep. Genauso isses.

Stefan

Hi.

Na supi,jetzt hab ich´s einigermaßen gelöst und es klappt trotzdem nicht. Bekomme beim kopieren immer die Fehlermeldung „Fehlende Zieldatei“,obwohl sich diese in diesem Verzeichnis befindet. Hab´s auch schon mit einer anderen Pfadangabe und mit anderen Dateien versucht,klappt nicht.
Ich flieg übermorgen in Urlaub und hab eigentlich gar keine Zeit mehr, mich jetzt auch noch mit Fehlermeldungen und dessen Behebung auseinanderzusetzen. Kannste mir mal bitte die zwei Skripte aufschreiben? Ich bin momentan ein bisschen in Zeitdruck und wollte das unbedingt noch vor meinem Urlaub erledigt haben.
Kannste mir natürlich auch per e-mail schicken,wenn Du willst.

Vielen Dank schonmal.

Gruß

Na supi,jetzt hab ich´s einigermaßen gelöst

Wie denn? (Hier haette Dein Loesungsversuch stehen koennen.)

und es klappt trotzdem nicht.

Ich flieg übermorgen in Urlaub [snip]

Ach…

Kannste mir mal bitte die zwei Skripte aufschreiben?

Du fliegst in Urlaub und ich soll Deine Hausaufgaben machen? Noe.

Gruss vom Frank.