• 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]

A

Anonymous

Gast
So ein Problem löst man normalerweise mit regulären Ausdrücken und oftmals mit dem Befehl sed
ist aber bestimmt kein Anfänger-taugliches-Problem

Auf Bash-Ebene ist das schwierig zu lösen. Da die Eingabe auseinander genommen werden muss und jedes Zeichen einzeln gepüft werden muss ;) aber nicht unmöglich.

Auch fehlt eine Definition was zB bei Eingaben "123 123 123" oder "0xAF" "0.1234" oder ähnlichen passieren soll, sind das jetzt Zahlen oder sind das keine Zahlen ??????

Mal davon ungeachtet könnte man das mit Schleifenkonstrukten auf Bash-Ebene zB so hier lösen.
Code:
while true
do
   read -p "Bitte Eingabe :" antwort

   IS_NO_ZAHL=0
   IS_ZAHL=0

   if( test -z "$antwort" )
   then
       echo "Es wurde nichts eingegeben; beende Script "
       break
   else
       EINGABELAENGE=${#antwort}
       for ((i=0; $i<$EINGABELAENGE ; i=$(($i + 1)) ))
           do
             if  echo "0123456789" | grep "${antwort:$i:1}" >/dev/null 2>&1
             then
                IS_ZAHL=1
             else
                IS_NO_ZAHL=1
             fi
           done
   fi

   if [  $IS_NO_ZAHL = "1" -a  $IS_ZAHL = "1" ]
   then
        echo "ist gemischt"
   else
        if [ $IS_NO_ZAHL = "1" ]
        then
           echo "keine Ziffer dabei"
        else
           echo "nur Ziffern"
        fi
   fi
done
robi
 
OP
I

intergo

Member
Ich will ja die eingabe nach buchstaben und zahlen checken, d.h. wenn es buchtaben sind , dann in datei1 , wenn zahlen in datei2.
wie soll ich es sonst noch machen, bzw. hab alles versucht es geht nicht
 
A

Anonymous

Gast
intergo schrieb:
hab alles versucht es geht nicht
Wirklich "ALLES" ;) glaube ich nicht.

siehe mal oben das Script, eventuell haben sich unsere Beiträge zeitlich überschnitten, und du hast es noch nicht gefunden.

robi
 
OP
I

intergo

Member
ok ,werde ich machen , ich führe aufjedenfall dein skript aus und versuche nachzuvollziehen für was jede zeile gut ist.
Ich will es ja im endeeffekt verstehen und nicht einfach blind alles übernehmen.
Sorry hatte ich nicht gesehen
 
A

Anonymous

Gast
Eventuell gehts auch so hier, deckt eventuell nicht immer alles wirklich sicher sauber ab, ist wahrscheinlich aber etwas einfacher zu verstehen
Code:
while true
do
   read -p "Bitte Eingabe :" antwort

   IS_NO_ZAHL=
   IS_ZAHL=

   if( test -z "$antwort" )
   then
       echo "Es wurde nichts eingegeben; beende Script "
       break
   else
        IS_ZAHL=$(echo "$antwort" | grep [0-9])
        IS_NO_ZAHL=$(echo "$antwort" | grep  [a-zA-Z] )

        if [  -n "$IS_NO_ZAHL" -a  -n "$IS_ZAHL"  ]
           then
             echo "ist gemischt"
           else
             if [ -n "$IS_NO_ZAHL" ]
             then
                 echo "keine Ziffer dabei"
              else
                 echo "nur Ziffern"
             fi
        fi
    fi
done
unter Umständen kommt man hier schnell auch zu völlig sonderbaren Ergebnissen. siehe auch folgenden alten Beitrag
http://www.linux-club.de/viewtopic.php?f=21&t=29854

robi
 
OP
I

intergo

Member
danke die zweite variante ist besser:
meine ist nämlich so ähnlich nur er hängt mir das ergbnis nicht an die Datei:

Code:
while true
do
b=
a=
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 "


else
a=$( echo "$antwort" | grep [a-zA-Z] )
b=$( echo "$antwort" | grep [0-9] ) 


if [ -n  "$a" ]
then
echo $a >>date1.txt

else

if [ -n "$b" ]
then
 
echo $b >>date2.txt


 
else 


 if [ -n "$a" -a "$b" ]
then

echo  $antwort  >>date3.txt


fi

fi
fi
fi

done
read -p kenn ich ja gar nicht, hatten wir auch noch nie in der vorlesung
 
OP
I

intergo

Member
Ich danke euch für eure hilfe, hab wirklich wa gelern habs auch hinekommen:

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



 


while true
do
b=
a=
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 "


else
a=$( echo "$antwort" | grep [a-zA-Z] )
b=$( echo "$antwort" | grep [0-9] ) 
c=$( echo "$antwort" | grep [0-9][a-zA-Z] )

if [ -n "$a" -a "$b" ]
then

echo  "$a$b">>date3.txt
 
else

if [ -n  "$a" ]
then
echo $a >>date1.txt


else

if [ -n "$b" ]
then
 
echo $b >>date2.txt


fi

fi
fi
fi
done


Danke an alle, die mir geholfen haben.
 

framp

Moderator
Teammitglied
Fein dass Du es erfolgreich hinbekommen hast :thumbs:

Einen Kommentar habe ich noch: Bei robi ist der Code immer schön auf Blockebene eingerückt. Das erleichtert die Lesbarkeit ungemein und ist immer zu empfehlen. Hast Du keine oder sind die durch irgendwelche copy/paste Aktionen einfach nur rausgefallen?
 

framp

Moderator
Teammitglied
:schockiert: Dann empfehle ich Dir Dir das schnellstens anzugewöhnen z.B. -> http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil. Ist das nicht in der Vorlesung besprochen worden? Ich habe noch nie ein Programm von einem Fortgeschrittenen oder Profi gesehen, welches nicht Einrückungen benutzte. Damit macht man sich nur das Leben unnötig schwerer.
 
OP
I

intergo

Member
ach wollte noch fragen , wollte einen Zähler machen , der die eingaben zählt und einen, der zählt ,wenn SOnderzeichen ,anstatt Buchstaben oder Zahlen eingegeben werden.
Daraus wollte ich den Prozentualen Anteil berechnen :da ist mein code aber er rechnet es nicht:
Code:
#! /bin/bash
set -x
#Sortierung der Eingaben je nach Inhalt in Datei



while true
do
zaehler=0
aussch=0
let aussch=$aussch+1
b=
a=
c=
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
let zaehler=$zaehler+1

echo "es wurden $zaehler Eingaben gezählt"

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


      else
      a=$( echo "$antwort" | grep [a-zA-Z] )
      b=$( echo "$antwort" | grep [0-9] ) 
      c=$( echo "$antwort" | grep [!0-9][!a-zA-Z] )

	  if [ -n "$a" -a "$b" ]
	      then

	      echo  "$a$b">>date3.txt
  
	     
		
	  
		  if [ -n  "$a" ]
		  then
		  echo $a >>date1.txt


		  else

		      if [ -n "$b" ]
		      then
 
		      echo $b >>date2.txt

			    
			    if [ -n "$c" ]
			      then
			      let prozent=$zaehler*100/$aussch
			      echo "Der Prozentsatz der Ausschüsse betreagt $prozent %"
			      echo "Ausschus"  

			  fi
		      fi

		  fi  
     
fi
done
 

framp

Moderator
Teammitglied
Fein. Aber bitte achte zukünftig auch auf die Einrückungen! So ganz stimmer sie in Deinem letzten Posting noch nicht :roll:
 
OP
I

intergo

Member
eine frage ,m wenn ich der variable einen Wert zuweise, muss man es mit dem $ davor machen oder?

alsoa=$(echo $anzahl | grep [a-z] ) z.b. oder könnte man anstatt den $ und den () die `` verwednen?
 
A

Anonymous

Gast
Code:
Variable=$(KOMMANDO)
ist genau das selbe wie
Code:
Variable=`KOMMANDO`
allerdings ist die erste Schreibweise hier im Forum oder im Internet allgemein besser erkenntlich, da die beiden "`" leicht zu übersehen und machmal auch nicht wirklich immer richtig im Webbrowser angezeigt werden.

robi
 
Oben