• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Shellscript

Crusher-ScT-

Guest
Hi,

also morgen hab ich BSUNIX klausur.

Nun ein paar Fragen:

Shellscripte:
Auf was überprüft die Testanweisung:
Code:
[ -n $1 ]
?

$1 ist der erste Parameter den ich beim Aufruf des Scripts mitgebe. Aber was macht das -n ?

2. Was bewirken Backqoutes ?

das wars schon fürs erste ;)

Gruss Crusher
 
Mitglied seit
03.08.2002
Beiträge
546
Reaktionen
0
Ort
Krefeld
http://www.netzmafia.de/skripten/unix/unix2.html

zu 1.

google.gif


Optionen
+n ab der n. Zeile ausgeben
-n die letzten n Zeilen ausgeben Wird hinter die Zahl n ein 'b' gesetzt (z. B. -15b), werden nicht n Zeilen, sondern n Blöcke ausgegeben. Wird hinter die Zahl n ein 'c' gesetzt (z. B. -200c), werden nicht n Zeilen, sondern n Zeichen (characters) ausgegeben.
-r Zeilen in umgekehrter Reihenfolge ausgeben (letzte zuerst). Geht nicht bei GNU-tail - stattdessen kann man das Programm toc verwenden.
-f tail am Dateiende nicht beenden, sondern auf weitere Zeilen warten. (Ende des Kommandos mit der CTRL-C-Taste). Damit kann man z. B. Logfiles beobachten, die ständig wachsen.

und zu 2.

google.gif


2.5 String-Ersetzungen (Quoting)
Um bestimmte Sonderzeichen (z. B. *, ?, [ ], Leerzeichen, Punkt) zu übergeben, ohne daß sie von der Shell durch Dateinamen ersetzt werden, werden Anführungszeichen verwendet, die auch ineinander geschachtelt werden können. Dabei haben die drei verschiedenen Anführungszeichen Doublequote ("), Quote (') und Backquote (`) unterschiedliche Bedeutung:

Zwischen Backquote (Accent Grave) gesetzte Kommandos werden ausgeführt und das Ergebnis wird dann als Parameter übergeben (d. h. die Ausgabe des Kommandos landet als Parameter in der Kommandozeile). Dabei werden Zeilenwechsel zu Leerzeichen. Braucht dieses Kommando Parameter, tritt die normale Parameterersetzung in Kraft. Zum Beispiel:
echo "Aktuelles Verzeichnis: `pwd`"
Weil die verschiedenen Quotes manchmal schwer zu unterscheiden sind, wurde bei der bash eine weitere Möglichkeit eingeführt. Statt in Backquotes wird die Kommandofolge in $( ... ) eingeschlossen., z. B.:
echo "Aktuelles Verzeichnis: $(pwd)"

Google, da werden Sie geholfen ;)
 

Crusher-ScT-

Guest
das 1. kapier ich immer noch net.


Script "Klausur":
Code:
[ $# -ge 2 ] && 
echo 1 || 
[ -n $1 ] && 
echo 2  ||
echo 3 || 
echo 4 
echo $0 $*

Was bringen die folgenden eingaben:
1.klausur
2.klausur a
3.klausur a b

??

Gruss crusher
 

Wiseguy3

Guest
Original geschrieben von [cruSher]-ScT-


Was bringen die folgenden eingaben:
1.klausur
2.klausur a
3.klausur a b

??

Gruss crusher
Mit ner tcsh:
Code:
[Birk:~/Desktop] weezer% ./klausur
2
./klausur
[Birk:~/Desktop] weezer% ./klausur a
2
./klausur a
[Birk:~/Desktop] weezer% ./klausur a b
1
2
./klausur a b
[Birk:~/Desktop] weezer%
Mit ner bash das selbe - scheint so, als ob das Script aber was anderes ausgeben sollte - sowas wie anzahl der übergebenen Parameter oder so.

Was fürne Shell benutzt ihr?
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
-n ueberprueft, ob der string nicht null (true) ist.
 

Crusher-ScT-

Guest
hmm genau das kapier ich nicht ...

er geht rein .. parameter gleich oder grösser 2 ????

NO -- > geht zu der 2.testanweisung nach den || ... ist der parameter nicht null ?????
NO --> ER IST NULL ...

dann müsste er aber doch 3 ausgeben und nicht 2 ODER ?

bin ich blöd ? ;)



wir benutzen die bash shell ... wenn das überhaupt eine shell ist .. :( den unterschied zwischen bash,bourne shell usw. hab ich net kapiert ... ist auch nicht wichtig.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
$# ist die anzahl der parameter. aendere $1 in "$1".
bash = bourne again shell
 

Crusher-ScT-

Guest
das ist eine aufgabe aus einer alten klausur .. also ich will die anweisungen nicht ändern sondern kapieren warum da echo 2 ausgeführt wird und nicht echo 3. :(
 

Crusher-ScT-

Guest
also seh ich das richtig das ihr mir das auch net logisch begründen könnt, weil die anweisung von da oben eigentlich schwachsinn ist und auch net das macht was mit ihr eigenltich beabsichtigt war ... :)
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
problem ist, du willst ein string ueberpruefen, aber was ist $1, wenn nichts als argument uebergeben wird? deshalb in "" setzen, dann ist das ein leerer string.
 

Crusher-ScT-

Guest
achso ...

also ohne die "" kann man nicht so wirklich wissen was die shell da macht ... mit "" kann man dann genau sagen:$1 wird praktisch ersetzt durch NIX .. dadurch überprüfen wir halt "" .. also einen leerstring ... und somit wird die testanweisung zu false ausgewertet und echo 3 wird "richtig" ausgegeben.
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
genau. ohne einem wert in $1 wird [ -n ] ausgefuhrt, also ohne argument fuer -n. das ist halt immer true.
 

Crusher-ScT-

Guest
ok dann nun was neues ;)
geht um PID`s.

folgendes C-Programm:

Code:
int main () {
int status, i = 0;
pid_t pid;
pid = fork();
if (pid != 0)
{	i++;
	waitpid(pid, &status, 0);
	printf("\n Im Vater hat i den Wert %d", i);
} else {
	i = 5;
	printf("\n Im Kind hat i den Wert %d", i);
	i++;
	printf("\n Jetzt bin ich der Vater: i hat den Wert %d. ", i);
	pid = fork();
	printf("Meine PID ist %d\n", pid);
	}
printf("\n Ende von Prozess %d\n", pid);
}

Ich hab die Ausgabe und auch habs eigentlich auch soweit kapiert. Auch hier sind meiner meinung nach die namen etwas scheisse gewählt, weil ja die eigentlichen richtigen PID`s nicht ausgegeben werden, weil ja nie getpid() gemacht wird. Aber egal.

Ich hab nur eine Frage zu dem "\n". Das macht ja im Grunden einen Zeilenumbruch. Aber was passiert wenn das nicht gemacht wird. Also Zeile 13: Da wird ja was geschrieben aber nach dem vor dem 2. " wird KEIN \n gemacht. Dann kommt fork(). Und dann kommt wieder ein printf("Meine pid ist ...\n").

KANN es da sein das er das erste printf nochmal ausgibt, weil es noch irgendwie im Puffer ?!? liegt ?

Also das printf liegt noch im puffer .. es wird fork() gemacht und weil kein \n gemacht wurde wirds nochmal gerade vorneweg ausgegeben.

IST das möglich ? Hat das \n was mit dem Puffer zu tun oder ist das vollkommener Blödsinn ?

Gruss Crusher
 

The_Company

Guest
Jupp, ist absolut korrekt.
glibc gibt eine Zeile für stdout immer nur bis zum letzten Newline aus.
Das heisst, wenn du forkst ohne alle Buffer geflusht zu haben, dann wird der Inhalt der Buffer 2x ausgegeben.

FIx dafür:
Alle wichtigen Buffer mit fflush leeren, in diesem Fall vor dem fork ein fflush (stdout); sollte reichen.

Anderer interessanter Nebeneffekt:
Mach aus den Strings alle Newlines weg, dann haste die kompletten Strings :)
 
Oben