这是我下面的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
..它总是给予
它没有显示这条线
你修好了吗?是/否:
但它却无穷无尽地展示了下面
请回答是还是否?请回答是还是否?
无限循环,它一次又一次地显示相同的消息。
任何帮助
发布于 2022-04-15 12:07:51
外部函数将标准输入重定向为从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 (我留在了进程替换中,以防您想要看到它在语法上是什么样子)。
https://stackoverflow.com/questions/71883496
复制相似问题