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
可以很好地读取和丢弃秒后的字段。
printf
比 echo
更通用,但在这种情况下,当您只想输出静态字符串时,我切换到 echo
.
演示:https://ideone.com/pVerFm
(我把流程替换留在那里,以防你想看看它在语法上的样子。)
这是我下面的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
可以很好地读取和丢弃秒后的字段。
printf
比 echo
更通用,但在这种情况下,当您只想输出静态字符串时,我切换到 echo
.
演示:https://ideone.com/pVerFm (我把流程替换留在那里,以防你想看看它在语法上的样子。)