bash: while 循环进入无限循环 while case 语句

bash: while loop going to infinite loop while case statement

这是我下面的bash脚本

#!/bin/bash
verify()
{
  while true ;do
      read -p "Have you fixed  ? Yes/No: " yn
      case $yn in
         YES|Yes|yes|y|Y)
         printf "Hola"
         check_status
         break
         #continue
         ;;
         NO|No|no|n|N)
         printf "Please fix"
         ;;
         *)
         printf "Please answer yes or no.\n"
         ;;
     esac
  done
}

check_status()
{
  while IFS=" " read -r rec1 rec2
  do
  if [ $rec2 == 'up' ]
  then
    echo "$rec1 is up"
  else
    echo "$rec1 is down so please fix"
    verify
  fi
  done < <(cut -d " " -f1,2 compute_list)
}


check_status

我的计算列表是

abcd up
efgh down
..

它总是在给予

没有显示线

你修好了吗? Yes/No:

但是它无限显示下面的内容

请回答是或否? 请回答是或否?

无限循环它一次又一次地显示相同的消息

任何帮助

您的外部函数已将标准输入重定向为从 cut 进程替换中读取,因此 read 正在从中读取其输入。

也许使用一个单独的文件描述符来替换进程。

此外,您的 verify 函数再次递归调用 check_status;可能把它去掉!

verify()
{
  while true ;do
      read -p "Have you fixed? Yes/No: " yn
      case $yn in
        YES|Yes|yes|y|Y)
         echo "Hola"
         # check_status # DON'T!
         break
         ;;
        NO|No|no|n|N)
         echo "Please fix"
         ;;
        *)
         echo "Please answer yes or no."
         ;;
     esac
  done
}
 
check_status()
{
  # Notice read -u 3 to read from fd3
  # Notice _ to read fields 3 and up
  while IFS=" " read -u 3 -r rec1 rec2 _
  do
    # Syntax: single =, add quoting
    if [ "$rec2" = 'up' ]
    then
      echo "$rec1 is up"
    else
      echo "$rec1 is down so please fix"
      verify
    fi
  # Notice 3<
  done 3< compute_list
}
 
check_status

我还冒昧地修正了你的缩进,避免了不必要的流程替换; read 可以很好地读取和丢弃秒后的字段。

printfecho 更通用,但在这种情况下,当您只想输出静态字符串时,我切换到 echo.

演示:https://ideone.com/pVerFm (我把流程替换留在那里,以防你想看看它在语法上的样子。)