Sie sind nicht angemeldet.

1

16.05.2010, 23:22

[gelöscht] Bash Skript : Schleife falsch ???

Bei meinen Bash-Versuchen habe ich momentan einen Knoten im Schlauch :crazy:
ich versuche ein ganz einfaches Skript zu bauen, mit dem ich einige per Tastatur eingegebene Durchläufe aus einer Schleife mit vorgegebener Zahl der Durchläufe entfernen kann. Eigentlich würde ich das gerne mit einem Array lösen, aber dazu hab ich nichts gefunden, also versuch ich das jetzt mit zwei ineinander geschachtelten Schleifen. Das ist der Code dazu :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh
#der erste Teil erzeugt eine Negativliste aus den Tastatureingaben

ohne=0;                       # Vorbelegung
Minusliste="";              # Vorbelegung
echo "Negativelemente eingeben [1 bis 12; beenden mit Leereingabe]"
while [[ ${ohne} != "" ]]; do                  # Schleife, solange keine leere Eingabe
    AlteListe=${Minusliste};                  # Liste vor Eingabe
    read ohne;                                      # Tastatureingabe

    case ${ohne} in 
         [123456789]) ohn='0'${ohne} ;  # erzeugt führende Null bei 1 bis 9
                      ohne=${ohn} ;;
    esac
    
    ohnemitspace=' '${ohne};            # setzt Leerzeichen vor die Zahl
    Minusliste=${AlteListe}${ohnemitspace};   # neue Liste
  done;

echo ${Minusliste};  # Kontrollausgabe -- funktioniert auch  ;-)))





# der zweite Teil wertet die Negativliste aus und führt sonst die Aktion aus

for i in 01 02 03 04 05 06 07 08 09 10 11 12; do

     aktion="ja";                    # Voreinstellung
     for j in [${Minusliste}]; do    # Schleife mit Elementen der Negativliste
         if [ ${i}=${j} ];           # Vergleich der Nummern
               then aktion="nein"    # Boolsche Variable ändern bei Gleichheit
         fi;
     done;
     echo ${i}" "${aktion};           # Kontrollausgabe Aktion 
     
     if [[ "${aktion}"="nein" ]] 
             then echo "neeeee"   
             else echo "jaaaaaaaa!!!"
     fi;   
done;
exit;


das Ergebnis sieht so aus : die Kontrollausgabe der Minusliste ergibt genau das was sie soll, also eine Zeile wie 04 05 08 . Die Ausgabe des zweiten Teils ist aber immer dieselbe :
für alle zwölf Zahlen jeweils zwei Zeilen (jetzt das Beispiel für 01) :

01 nein
neeeee

D.h. die Voreinstellung "ja" wird IMMER überschrieben. ... :?b
Ich hab das ganze jetzt auch schon "zu Fuß" nachvollzogen ---- ich kaum einfach nicht drauf woran das hapert , nehme aber an es liegt an diesem Stück

Quellcode

1
for j in [${Minusliste}]


Kann mir da jemand weiterhelfen ?

Vielen Dank schon mal !!

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

17.05.2010, 16:31

RE: Bash Skript : Schleife falsch ???

ändere

Quellcode

1
if [ ${i}=${j} ]; 

zu

Quellcode

1
if [ ${i} = ${j} ]; 

oder besser noch

Quellcode

1
if [ "${i}" = "${j}" ]; 
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

3

17.05.2010, 16:52

Danke, dass du dir das mal angesehen hast, linuxerr.
Habe beides probiert, ergibt aber beides keine Änderung. Ich habe auch schon mehrere Varianten für die Zeile darüber aus probiert, z.B. ${Minusliste} statt [$[Minusliste}] und auch mit Variationen mit und ohne Leerzeichen, zwei [[ statt nur einer usw. Bisher war aber nix passendes dabei.

Was ich so komisch finde : am i wird's ja kaum liegen, aber warum ist das j immer das gleiche, auch wenn in der Minusliste weit und breit kein entsprechendes Char-Zeichen ist :keineahnung:

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

17.05.2010, 16:58

ich muss mir dein script mal genauer anschauen, obwohl ich noch nicht so richtig verstehe, was es eigentlich machen soll. die syntax mit dem if ohne die leerzeichen am gleichheitszeichenist auf jeden fall falsch und warum in der for-schleife $Minusliste in eckigen klammern steht, hat sich mir auch noch nicht erschlossen.
ich schau mir das heute abend noch einmal an, habe jetzt wenig zeit und muss gleich weg.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

5

17.05.2010, 17:01

vielen Dank schon mal ! :chinese: Tut mir leid, dass ich dir ständig auf den Wecker fallen muss, aber nach ein paar Stunden knobeln muß ich dann eben doch einsehen, dass es noch nicht ganz reicht ..

6

17.05.2010, 21:35

Meine Regel Nummer 1:
Immer "[[ ... ]]" statt "[ ... ]" oder "test ..." benutzen.

Außerdem habe ich mal eine Ausgabe eingebaut und da sieht man, dass Du da irgendwie noch eckige Klammern mit vergleichst, aber das ist mir jetzt egal.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/sh
#der erste Teil erzeugt eine Negativliste aus den Tastatureingaben

ohne=0;                       # Vorbelegung
Minusliste="";              # Vorbelegung
echo "Negativelemente eingeben [1 bis 12; beenden mit Leereingabe]"
while [[ ${ohne} != "" ]]; do                  # Schleife, solange keine leere Eingabe
    AlteListe=${Minusliste};                  # Liste vor Eingabe
    read ohne;                                      # Tastatureingabe

    case ${ohne} in
         [123456789]) ohn='0'${ohne} ;  # erzeugt führende Null bei 1 bis 9
                      ohne=${ohn} ;;
    esac

    ohnemitspace=' '${ohne};            # setzt Leerzeichen vor die Zahl
    Minusliste=${AlteListe}${ohnemitspace};   # neue Liste
  done;

echo ${Minusliste};  # Kontrollausgabe -- funktioniert auch  ;-)))





# der zweite Teil wertet die Negativliste aus und führt sonst die Aktion aus

for i in 01 02 03 04 05 06 07 08 09 10 11 12; do

     aktion="ja";                    # Voreinstellung
     for j in ${Minusliste}; do    # Schleife mit Elementen der Negativliste
# so hättest du einen der fehler gefunden:
        #echo ${i} = ${j} ?;
         if [[ $i = $j ]]; then          # Vergleich der Nummern
               aktion="nein";    # Boolsche Variable ändern bei Gleichheit
         fi;
     done;
     echo ${i}" "${aktion};           # Kontrollausgabe Aktion

     if [[ "${aktion}"="nein" ]]
             then echo "neeeee"
             else echo "jaaaaaaaa!!!"
     fi;
done;
exit;

7

17.05.2010, 22:58

:applaus: und :danke: euch beiden wieder mal

die richtige Verteillung von Leerzeichen, Klammern und ähnlichen Sachen wird bei mir wohl einige Zeit dauern.
Aber mit solch kompetenter Hilfe krieg ich das schon noch hin. Und ich werd mich wirklich bemühen, euch seltener "auf den Wecker zu fallen" :chinese:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »delix« (17.05.2010, 22:58)


Thema bewerten