Unix Aufgabe

F

fff619

Grünschnabel
Hi

ich hab eine Aufgabe bezüglich Unix Skripts bekommen, jedoch komm ich da nicht ganz mit der Aufgabe klar bzw. wie ich die Lösung machen soll.

Ich soll $1 verwenden, weiß jedoch überhaupt nicht, was ich damit mache muss...

________________________________
Aufgabe lautet wie folgt:

Kopieren Sie alle .c-Dateien des als Parameter übergebenen Verzeichnisses in ein neu zu erstellendes Verzeichnis ~/tmp/work

Behandeln Sie die Fehlermöglichkeiten (tmp nicht da; work nicht da; eines von beiden kein Verzeichnis; work nicht leer) durch entsprechende Fehlermeldungen.

Kompilieren Sie die kopierten Dateien.

Testen Sie, ob die Programme ausführbar sind.

________________________________

Das ist das, was ich schon habe:


gcc 1.c --> zum kompilieren

zum Testen:

test -x a.out wenn nein, dann soll eine Ausgabe „Problemmeldung“ erscheinen


Hilfe: man basename



if


mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work
for I in *.c ; do
gcc $i


bei den ... weiß ich einfach nicht, was da noch hingehören soll.
Hoffe, dass mir jemand helfen kann.
 
if


mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work
for I in *.c ; do
gcc $i

Hast du das gemacht oder war das vorgegeben? Also in $1 steht die erste beim Aufruf des Script übergebene Variable. In deinem Fall das Quellverzeichniss. Beispiel:
script.sh /pfad/zur/quelle

Was heißt Unix Scripts? Bash, Ksh, Perl...?
 
Du könntest zb ein Skript in der Form:

Code:
#!/bin/bash

echo $1

ausprobieren und schauen, was es macht, wenn du das skript mit zb "./skript.sh blah" ausführst.

Der rest sollt eigentlich recht straight forward sein:
Behandeln Sie die Fehlermöglichkeiten
  • tmp nicht da
    test -e $HOME/tmp
  • work nicht da
    test -e $HOME/tmp/work
  • eines von beiden kein Verzeichnis
    test -d $HOME...
  • work nicht leer
    test -e $HOME/tmp/work/*
durch entsprechende Fehlermeldungen.

for I in *.c ; do
gcc $i

würde ich vermeiden, wenn du ein Programm hast, dass aus mehreren *.c dateien besteht kannst du sie nicht einzeln kompilieren und linken (was du hier machen würdest). Du kannst sie zwar kompileren ohne sie zu linken (-c) aber dann musst du das Programm erst recht wieder extra zusammenlinken. Statdessen wärs besser, wenn du
Code:
 gcc *\.c
 
@Remidemi

es war nur das mit dem cp und dem gcc vorgegeben

achja, und "unix skript". also wir arbeiten mit der bash und benutzen dort den editor mit gedit

@marcellus

danke schon für die mehreren lösungsansätze

zu einem erst einmal das:

wenn ich echo $1 eingebe kommt nur eine Leerzeile.



Code:
for I in *.c; do
gcc $i

Das war eh klar, dass es nicht klappen würde. Ich hab es jedoch da gelassen, damit ich es nicht vergesse bzw. wie du jetzt mir die richtige Lösung sagen kannst :).

_____

Wie soll ich das mit den test -e usw. verwenden?

sollte ich es dann so machen?
Code:
$1=test -e $HOME/tmp
$2=test -e $HOME/tmp/work
$3=test -d $HOME/tmp/work
$4=test -d $HOME/tmp
$5=test -e $HOME/tmp/work/*

if [ "$1" == true ] && [ "$2" == true ] && [ "$3" == true ] && [ "$4" == true ] && [ "$5" == true ]
then
mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work
else
echo "Problem"
fi
 
sollte ich es dann so machen?

Code:
$1=test -e $HOME/tmp
$2=test -e $HOME/tmp/work
$3=test -d $HOME/tmp/work
$4=test -d $HOME/tmp
$5=test -e $HOME/tmp/work/*

if [ "$1" == true ] && [ "$2" == true ] && [ "$3" == true ] && [ "$4" == true ] && [ "$5" == true ]
then
mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work
else
echo "Problem"
fi

if [ ! -d $HOME/tmp ]
then
echo tmp existiert nicht oder kein Verzeichniss
fi

if [ ! -d $HOME/tmp/work ]
then
echo work existiert nicht oder kein Verzeichniss
fi

if [ ! -e $HOME/tmp/work/* ]
then
echo work nicht leer
fi

mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work

...

Die [...] ersetzen das test Kommando.
 
Zuletzt bearbeitet:
@Remidemi
@marcellus

danke schon für die mehreren lösungsansätze

zu einem erst einmal das:

wenn ich echo $1 eingebe kommt nur eine Leerzeile.

Du sollst nach dem skript einen Parameter übergeben, also so wie ich es oben schon hingeschrieben hab mit "./skript.sh blah".

Wie soll ich das mit den test -e usw. verwenden?

sollte ich es dann so machen?
Code:
$1=test -e $HOME/tmp
$2=test -e $HOME/tmp/work
$3=test -d $HOME/tmp/work
$4=test -d $HOME/tmp
$5=test -e $HOME/tmp/work/*

if [ "$1" == true ] && [ "$2" == true ] && [ "$3" == true ] && [ "$4" == true ] && [ "$5" == true ]
then
mkdir -p $HOME/tmp/work
cp $1/*.c $HOME/tmp/work
cd $HOME/tmp/work
else
echo "Problem"
fi

Es ist keine gute Idee $1, $2 usw zu überschreiben, weil du dir damit die skript parameter überschreibst.

Da du die Fehler einzeln behandeln musst würd ich eher:

Code:
if ! [ -e $HOME/tmp ]
then
        echo "tmp existiert nicht :("
        exit
else
...

Aber dir das ganze vorzubeten hat sicher recht wenig sinn, du solltest dir eher ein tutorial suchen und einfach etwas herumspielen, sonst lernst du gar nichts dabei.
 
oh mann....

das ist ja eigentlich sowas von einfach und ich stelle mich einfach nur dumm :/

Danke für eure Hilfe. Hab leider auf dem Rechner kein ubuntu bzw. allgemein UNIX, kann von daher auch nicht die Kommandos testen bzw. mit der Arbeit weitermachen (um zu sehen, ob die Kommandos auch klappen).

Also nochmal, vielen Dank (marcellus & Remidemi), dass ihr mir erklärt habt, was was ist bzw. wie ich das machen soll.

Ich schaue dann heute Abend noch ab und zu hier rein, werde jedoch mein Endresultat zu der Aufgabe morgen posten.
 
Zuletzt bearbeitet:
Du kannst dir virtualbox auf deinem pc installieren und musst dann nur noch ein image vom linux derivat deiner wahl runterladen und mit der virtualbox anstarten.

Abgesehen vom download sollte das alles nicht länger als 5-10min dauern.
 
Edit: Fehler gefunden

Die originalen *.c Dateien hatten als Inhalt nur test und ich hab bei den kopierten Dateien als Inhalt einen richtigen Source Code (also ein .c Programm) eingegeben. Folge --> Die kopierten Dateien wurden mit dem Inhalt "test" überschrieben und die Fehlermeldung kam, dass der Source Code falsch ist. X(

Jedenfalls klappt das Programm jetzt einwandfrei :)

Problem gelöst --> Thread closen bitte

____________________________________


Kompletter Source Code

Code:
#! /bin/bash

if [ ! -d $HOME/tmp ]
then
echo tmp existiert nicht oder kein Verzeichnis
fi

if [ ! -d $HOME/tmp/work ]
then
echo work existiert nicht oder kein Verzeichnis
fi

if [ ! -e $HOME/tmp/work/ ]
then
echo work nicht leer
fi

mkdir -p $HOME/tmp/work
cp $HOME/*.c $HOME/tmp/work
cd $HOME/tmp/work

for I in *.c
do
E=$(basename $I .c)
cc $I -o $E.oc
if [ -x $E.oc ]
then
echo "$E.oc is executable"
fi
done

jedoch kommt diese Fehlermeldung

Code:
dokument1.c:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ at end of input
dokument1.oc is executable
dokument2.c:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ at end of input
dokument2.oc is executable
tx2.c:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ at end of input
tx2.oc is executable
 
Zuletzt bearbeitet:

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Kopieren von Dateien und oder Verzechnissen

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Akonadi startet nicht mehr

tar network backup problem

Zurück
Oben