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

Shellskript , der eine Additionsmatrix ausführt [Gelöst]

intergo

Member
Hallo,

ich habe folgendes Problem, soll ein Shellskript erstellten, der eine addition ausführt, d.h. links habe ich zwei zahlen 20 und 21 , diese müssen mit der oberen Zeile addiert werden ich habe es folgendermaßen progerammiert aber ich schaffe es nicht die ergebnisse von 20 in der zeile wo die zwnzig steht hinzubekommen und bei der 21 auch nicht, die werden mir unter der 20 und 21 angezeigt, d.h. ich schaffe es nicht ,diese als eine zeile auszugeben:
PS: ich soll es mit einer verschachtelten For schleife machen in dem shellskript
Das ist mein code:

#! /bin/bash
#set -x
# additionsmatrix


echo " + | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 "
echo "---+----+----+----+----+----+----+----+----+----+----"


for ((i=20; $i<=21; i++))
do

echo "$i |$result"
echo "---+"





for ((j=20; $j<=20; $j++))
do

let "$i+$j"



done

done


Danke
 

framp

Moderator
Teammitglied
In man echo findest Du ein Flag, dass eine newline Ausgabe am Ende unterdückt ;)
 

spoensche

Moderator
Teammitglied
Wenn ich dich richtig verstanden habe, willst du die vorher ausgegebene Zeile ersetzten. Das wird so einfach nicht funktionieren. Du kannst es dir aber ganz einfach machen, in dem du mit
Code:
clear
die getätigten Ausgaben löschst und dann die Ergebnisse ausgibst.
 
OP
I

intergo

Member
Sorry habe es falsch beschrieben:
Ne ich habe eine Aufgabenstellung bekommen und zwar folgende:
http://img29.imageshack.us/i/aufgabe.jpg/
den Link wählen, um zu sehen wie die Aufgabenstellung ist.
mein Problem ist, das ich die Ergbnisse von 20 und 21 nicht in einer zeile sondern unten als spalten bekomme.

Danke und sorry fpr die schlechte erklärung.
 
A

Anonymous

Gast
Dann schau dir mal hier den Unterschied an
Code:
for i in 1 2 3 4 5 6 7 8
do
  echo " $i "
done

for i in 1 2 3 4 5 6 7 8
do
  echo  -n " $i "
done
echo

robi
 
OP
I

intergo

Member
ah ok, danke
,d.h die ober for schleife ist für die spalten ud die untere für die zeilen die jeweils bis 8 gehen.
oder täusche ich mich?
 
A

Anonymous

Gast
intergo schrieb:
,d.h die ober for schleife ist für die spalten ud die untere für die zeilen die jeweils bis 8 gehen.
oder täusche ich mich?
die obere und die untere Schleife im obrigen Beispiel sind gleich, nur die Ausgaben werden dabei unterschiedlich angeordnet.

du musst die Schleifen verschachteln,
Code:
for i in .....            #Zeilen durchlauf
do
      .....
      for j in ......             #Spalten durchlauf
      do
           ......
      done
done
Wie eine fertige Lösung aussehen könnte, wollen wir dir jedoch nicht verraten, sonst währe ja der einzige Lerneffekt nur folgender:
es ist im Netz immer einen Dummer zu finden, der die Aufgaben für mich löst, also warum soll ich mich also selbst anstrengen und mich selbst mit den Problem herum ärgern?

robi
 

abgdf

Guru
Diese Darstellung ist echt ein Problem.
Es geht nur, wenn man so viele "-"-Zeichen nimmt (oder eine ähnliche Menge) wie in der Grafik der Aufgabe angegeben.

robi hat natürlich eigentlich recht, daß man keine fertigen Lösungen liefern sollte. Nun hab' ich den Kram aber geschrieben, ">/dev/null" wäre irgendwie schade, also dann doch mal hier. Entscheide selbst, ob Du was lernen willst oder nicht.

Gruß
 
OP
I

intergo

Member
Ich danke euch, natürlich will ich selbst etwas lernen.

Ich hatte nur gefragt, ob es bei der Schreibweise der zeilen und spalten einen unterschied beim echo gibt, denn echo -n steht da dafür, das man bei schreiben kein newline hat sondern direkt hinten dran.


Danke und froh neues Jahr an alle.
 
OP
I

intergo

Member
Tut mir leid für die vielen Frahen , bin halt ein Neling im Linux Bereich und der Shellskriptprogrammierung
ich habe es jetzt nochmat versucht, aber ich habe folgenden code:

echo " + | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 "




for j in 20 21
do
echo "---+----+----+----+----+----+----+----+----+----+----"
echo "$j |"

for ((i=20; i<=29; i++))
do
typeset -i zahl
zahl=$j+$i

echo -n "$zahl|"

done
done


und folgenden output:
+ | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29
---+----+----+----+----+----+----+----+----+----+----
20 |
40|41|42|43|44|45|46|47|48|49|---+----+----+----+----+----+----+----+----+----+----
21 |
41|42|43|44|45|46|47|48|49|50|

ich bekomm es efanch nicht hin die ergebnisse auf der gleichen zeile zu bekommen
das mit dem echo -n habe ich auch verstanden, ist ja , dass er alles auf einer zeie macht.
Habe auch versucht, zuerst die zeilen und dann die spalten geht auch nicht.
 
A

Anonymous

Gast
intergo schrieb:
Code:
und folgenden output:
 + | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 
---+----+----+----+----+----+----+----+----+----+----
20 |
40|41|42|43[color=#40BF00]|44|[/color]45|46|47|48|49|---+----+----+----+----+----+----+----+----+----+----
21 |
41|42|43|44|45|46|47|48|49|50|
Dann schau doch mal wo bei dir die Ausgabefehler sind
20 | (## hier darf kein Zeilenumbruch passieren)
40|41|42|43|44|45|46|47|48|49| (## hier muss ein Zeilenumbruch hin ) ---+----+----+----+----+----+----+----+----+----+----
21 | (## hier darf kein Zeilenumbruch passieren)
41|42|43|44|45|46|47|48|49|50| (## hier muss ein Zeilenumbruch hin)
Die Feldbreite innerhalb einer Zeile ist zu klein um daraus eine saubere Ausgabetabelle zu erzeugen

Danach suchst du in deinem Script genau diese Stellen und korrigierst sie
for j in 20 21
do
echo "---+----+----+----+----+----+----+----+----+----+----"
echo "$j |"

for ((i=20; i<=29; i++))
do
typeset -i zahl
zahl=$j+$i

echo -n "$zahl|" #hier stimmt die Feldbreite nicht

done
#hier fehlt ein Zeilenumbruch
done

robi
 
OP
I

intergo

Member
Warum kommt das echo hinter dem ersten done?
Hat es damit zu tun , dass er nachdem die Zeile von der 20 bearbeitet hat und die Trennlininen kommen ,das er bei der 21 es unterhalb der trennlinie hinschreibt in der gleichen zeile von 21?
 
OP
I

intergo

Member
ah okay, jetzt ist mir es klarer, da es ja eine geschatelte for schleife ist, wird zu erst die erste for mit 20 als spalte erstellt, dann geht es in die innere schleife und rechnet die Ergebnisse aus und das echo -n bei der ersten schleife sorgt dafür, dass die ergebnisse auf der gleichen zeile ist, wie die 20 und 21 und das zweite echo -n damit die ergbnisse nicht untereinander ausgegeben werden.
Zu dem echo nach dem ersten done ist dann praktisch, das er nachdem er die 20er zeile mit den------ darstellt,
dass er die ------- unterhalb der 20 zeile darstellt.

So habe ich es danke euch verstanden danke euch und entschuldige mich für die ständige fragerei.

ICh bin ein linuxneuling und versuche es zu lernen nur manchmal muss ich nachfragen.

PS: ich habe ein skript noch geschrieben, dass eine Usereingabe anhand von read verlang.
so wenn Zahlen eingegeben werden, soll er die in datei1 kopieren , wenn buchstaben in datei2 und wenn zahlen und buchstaben in datei3 nur der kopiert mir nichts.

sende dir gleich mal den code rüber
 
OP
I

intergo

Member
ok sorry also hier mein code dazu:


Code:
#! /bin/bash
#set -x
#Sortierung der Eingaben je nach Inhalt in Datei

while true
do
b=$[a-z]
a=$[0-9]



echo "1)In datei1: Nur Eingaben aus Buchstaben"
echo "2)In datei2: Nur Eingaben aus Ziffern"
echo "3)In datei3: die ziffern und Buchstaben haben"

echo "Bitte geben Sie irgendetwas ein"
read antwort


 if( test -z $antwort )
then
echo " Es wurde nichts eingegeben "



if ( test $antwort = "$b" ) 
then
 
tee $antwort date1.txt


 elif  ( test $antwort == "$a" )
then
 tee $antwort date2.txt


elif ( test $antowrt -eq $a -a $b )
#then

tee -a $antwort # date3.txt
fi
fi
done


Da habe ich folgendes Problem das er mr nichts in die dateien von der eongabe reinschreibt.
Er soll ja, wenn die eingabe nur aus Zahlen bestehen , diese n datei1 schreiben, wenn es Buchstaben sind in die datei2 und wenn es buchstaben u zahlen sind in datei3

könnt ihr mr ein Shellskript buch empfehlen oder kostenlose legale ebooks?
 

framp

Moderator
Teammitglied
if ( test $antwort = "$b" )
funktioniert so nicht wenn Du
gesetzt hast. Da müßtest Du reguläre Ausdrücke benutzen. Ich denke das ist hier auch nicht verlangt. Du musst einfach nur vergleichen, ob die Eingabe >= "a" und <= "z" ist.
tee $antwort date1.txt
Damit wird nichts in die Datei geschrieben. Nimm
echo $antwort >>date1.txt
>> hängt die Ausgabe an der Datei an
 
OP
I

intergo

Member
danke hab es hinbekommen, mein problem wwar, das ich nicht verstanden hatte, warum das echo nach dem done kam und ich hatt oben vergessen echo -n zu schreiebn
danke dir nochmal,

hab dan am ende wo ich das fertig hatte geschaut und ich mach mir auch dazu notizen.
Ich bin so einer ich will es verstehen was ich da schreibe, deine Lösung ist richrig gut.

Wirklich tolles forum.
Kennt ihr vieeleicht ebooks zu shellskriptprogrammierung?
 
OP
I

intergo

Member
JA, doch dan würde er doch nicht erkennen wenn ich zahlen eintrage ,dass es in die datei2 kommt.
wenn mein ausdruck größer ist als ,z , kann es doch keine Zahl sein oder?

Das war halt mein problem.
Danke dir
 
Oben