嵌套while循环在Bash中不起作用

嵌套while循环在Bash中不起作用,bash,Bash,这里是初学者,请容忍我。我试图比较一个解决方案文件和一个学生提交的作业文件。每个文件的内容都有三个问题,每行一个: problem 1 code problem 2 code problem 3 code 我想将解决方案中的每一行与学生提交的相应行进行比较。我使用for循环遍历每个学生文件,使用嵌套while循环遍历解决方案文件和学生文件的每一行。由于某些原因,脚本完全忽略while循环。我在每行之间放置了回音以查看问题所在(echo$解决方案和echo$提交只是为了检查路径是否正确): 它没

这里是初学者,请容忍我。我试图比较一个解决方案文件和一个学生提交的作业文件。每个文件的内容都有三个问题,每行一个:

problem 1 code
problem 2 code
problem 3 code
我想将解决方案中的每一行与学生提交的相应行进行比较。我使用for循环遍历每个学生文件,使用嵌套while循环遍历解决方案文件和学生文件的每一行。由于某些原因,脚本完全忽略while循环。我在每行之间放置了回音以查看问题所在(echo$解决方案和echo$提交只是为了检查路径是否正确):


它没有忽略while循环--您正在重定向用于stdout和stderr的文件描述符,因此
echo
无法写入其中的控制台

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
用于在/home/myfolder/submissions/*中提交;做
解决方案=(/home/myfolder/hwsolution/*)
if(${{solutions[@]}==1))&&[-e${solutions[0]}]];然后
solution=${solutions[0]}
其他的
echo“找到多个解决方案文件;不知道使用哪一个”>&2
printf'-%q\n'${solutions[@]}'>&2
出口
fi

读sans时,代码中没有嵌套的while循环,并且不清楚您发布的输出与您期望或想要的输出之间的关系。此外,也不清楚您期望什么有用的东西
1…您可能想要读取文件的内容吗?如果是这样的话,那么你想要
我告诉过你的-,它根本不会忽略它们。它试图运行循环,但是循环中的
echo
s不起作用,因为您重写了stdout和stderr。(此外,它不是在文件中的行上进行迭代,而是在文件的名称上进行迭代,因为您在过程替换中使用了不必要/不适当的
echo
s)。FD 0、FD 1和FD 2是保留的,因此当您运行
1I时,我会得到“找到多个解决方案文件…”即使home/myfolder/hwsolution中只有一个文件。那里只有一个文件。添加了一个
printf
来记录候选文件,这样你就可以确切地看到它认为文件列表是什么,从而找出除了一个文件之外的其他文件的原因/方式。我认为它是有效的!我忘记删除solutions=(/home/myfolder/hwsolution/*)中的$。你是个救命的人。那么这段代码实际上在做什么呢?我不太明白三和四。我从另一个帖子上得到了这个建议,但我们在课堂上还没有学到。是一个很好的起点…顺便说一句,是一个很好的相关资源,详细介绍
阅读
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
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