2017-11-18 22 views
0

Anfänger hier so mit mir zu tragen. Ich versuche, Hausaufgabeneinreichungen aus einer Lösungsdatei und einer Schülereinreichungsdatei zu vergleichen. Der Inhalt der einzelnen Dateien hat drei Probleme, ein pro Zeile:Verschachtelte While-Schleife funktioniert nicht in Bash

problem 1 code 
problem 2 code 
problem 3 code 

Ich mag jede Zeile in der Lösung mit der entsprechenden Zeile in den Studenten Vorlage vergleichen. Ich benutze eine for-Schleife, um durch jede Student-Datei und eine geschachtelte while-Schleife zu durchlaufen, um durch jede Zeile der Lösungsdatei und Student-Datei zu durchlaufen. Aus irgendeinem Grund ignoriert das Skript die while-Schleife vollständig. Ich habe zwischen jeder Zeile setzt Echos, um zu sehen, wo das Problem ist (die echo $ Lösung und echo $ Vorlage ist nur zu überprüfen, um zu sehen, ob der Pfad korrekt ist):

for submission in /home/myfolder/submissions/* 

    do 
    echo 1 
    solution=$(echo /home/myfolder/hwsolution/*) 
    echo 2 
    echo $solution 
    echo $submission 
      while read sans <&1 && read sol <&2 
      do 
    echo 3 
      echo Student awnser is: $sans 
      echo Solution is: $sol 
    echo 4 
      done 1<$(echo $submission) 2<$(echo $(echo $solution)) 
    echo 5 
done 

Wenn ich es laufen erhalte ich:

1 
2 
/home/myfolder/hwsolution/solution 
/home/myfolder/submissions/student1 
5 
1 
2 
/home/myfolder/hwsolution/solution 
/home/myfolder/submissions/student2 
5 
1 
2 
/home/myfolder/hwsolution/solution 
/home/myfolder/submissions/student3 
5 
+0

Es gibt keine geschachtelte while-Schleife in Ihrem Code, und es ist nicht klar, wie sich die von Ihnen gepostete Ausgabe auf die von Ihnen * erwartete * oder gewünschte Ausgabe bezieht. –

+0

Es ist auch nicht klar, welche nützliche Sache Sie erwarten '1 <$ (echo $ submission)' oder '2 <$ (echo $ (echo $ solution))' zu erreichen. (Auch die Verwendung von Dateideskriptor 1 oder Dateideskriptor 2 zur Eingabe ist eine * wirklich * schlechte Idee, da diese beiden für stdout bzw. stderr reserviert sind). –

+0

... möchten Sie vielleicht * den Inhalt der Dateien * lesen? Wenn ja, dann willst du '<" $ solution "', ohne 'echo'. –

Antwort

1

es ist nicht die while-Schleife zu ignorieren - Sie die Datei-Deskriptoren für stdout und stderr gewohnt sind Umleiten, so echo kann nicht an die Konsole in ihm schreiben.

for submission in /home/myfolder/submissions/*; do 
    solutions=(/home/myfolder/hwsolution/*) 

    if ((${#solutions[@]} == 1)) && [[ -e ${solutions[0]} ]]; then 
     solution=${solutions[0]} 
    else 
     echo "Multiple solution files found; don't know which to use" >&2 
     printf ' - %q\n' "${solutions[@]}" >&2 
     exit 
    fi 

    while read sans <&3 && read sol <&4; do 
      echo "Student awnser is: $sans" 
      echo "Solution is: $sol" 
    done 3<"$submission" 4<"$solution" 
done 

Die unmittelbarste Veränderung ist, dass wir FD3 und FD4, nicht FD1 und FD2 sind umleitet.

+0

Ich bekomme "mehrere Lösungsdateien gefunden ...", obwohl es nur eine Datei in home/myfolder/hwsolution gibt. Es wird immer nur eine Datei geben. – koll

+0

Ein 'printf' hinzugefügt, um die Kandidaten zu protokollieren, so dass Sie genau sehen können, wie die Liste der Dateien aussieht, und herauszufinden, warum/wie Sie etwas anderes als genau eine Datei haben. –

+0

Ich denke, es hat funktioniert! Ich habe vergessen, das $ in solutions = (/ home/myfolder/hwsolution/*) zu löschen. Du bist ein Lebensretter Mann. Was macht der Code eigentlich? Ich verstehe die & 3 und & 4 nicht ganz. Ich habe diesen Vorschlag von einem anderen Beitrag erhalten, aber davon haben wir in meiner Klasse nichts erfahren. – koll