Bash 是/否ksh上的无限循环
我有一个恼人的问题,似乎导致无限循环,我不知道为什么。如果我调用下面的函数,它会在屏幕上无限重复是/否选项,直到我崩溃Bash 是/否ksh上的无限循环,bash,shell,infinite-loop,ksh,Bash,Shell,Infinite Loop,Ksh,我有一个恼人的问题,似乎导致无限循环,我不知道为什么。如果我调用下面的函数,它会在屏幕上无限重复是/否选项,直到我崩溃 AuditUpload() { clear echo "Audit report generated successfully" echo " " echo "Do you wish to upload qhub_audit.csv? (1 = Yes/2 = No):" sleep 1 select yn in "Yes" "N
AuditUpload() {
clear
echo "Audit report generated successfully"
echo " "
echo "Do you wish to upload qhub_audit.csv? (1 = Yes/2 = No):"
sleep 1
select yn in "Yes" "No"; do
case $yn in
Yes ) AuditUploader; Auditvi; exit;;
No ) echo "Upload cancelled"; Auditvi; exit;;
esac
done
}
我把睡眠放进去,看看它是否能解决这个问题,但它仍然能解决这个问题。这个问题似乎是断断续续的,并非每次都会发生。这个脚本是用KornShell(ksh)编写的
AuditUploader函数:
AuditUploader() {
echo "Uploading qhub_audit.csv to $HOST..."
curl -v -T qhub_audit.csv -# ftp://xxxxxxxx:xxxxxxxxx@xxxxxxxxxxxxx.com/
if [ "$?" -ne "0" ]
then
echo "ERROR: Cannot upload qhubload.csv"
exit
else
clear
echo "qhub_audit.csv has been put on $HOST successfully"
tput cup 5 5
echo "Copy and paste this link into internet explorer to download:"
tput cup 7 5
echo "ftp://xxxxxxxx:xxxxxxxxx@xxxxxxxxxxxxx.com/qhub_audit.csv"
read LINK
fi
}
Auditvi() {
clear
echo "Do you wish to view qhub_audit.csv? (1 = Yes/2 = No):"
sleep 1
select yn in "Yes" "No"; do
case $yn in
Yes ) vi qhub_audit.csv; exit;;
No ) exit;;
esac
done
}
Auditvi功能:
AuditUploader() {
echo "Uploading qhub_audit.csv to $HOST..."
curl -v -T qhub_audit.csv -# ftp://xxxxxxxx:xxxxxxxxx@xxxxxxxxxxxxx.com/
if [ "$?" -ne "0" ]
then
echo "ERROR: Cannot upload qhubload.csv"
exit
else
clear
echo "qhub_audit.csv has been put on $HOST successfully"
tput cup 5 5
echo "Copy and paste this link into internet explorer to download:"
tput cup 7 5
echo "ftp://xxxxxxxx:xxxxxxxxx@xxxxxxxxxxxxx.com/qhub_audit.csv"
read LINK
fi
}
Auditvi() {
clear
echo "Do you wish to view qhub_audit.csv? (1 = Yes/2 = No):"
sleep 1
select yn in "Yes" "No"; do
case $yn in
Yes ) vi qhub_audit.csv; exit;;
No ) exit;;
esac
done
}
经过一段时间的处理后,每当“curl”命令返回一个特定错误,导致
kill$$
无法正常工作时,它看起来就像是在循环。我将kill$
替换为exit 1
,并相应地修改了其他函数。我还加入了一个应急措施,以防FTP失败时使用kermit。无论如何,这就是我的代码现在的样子:
#########################################
# Upload quotehub audit report function #
#########################################
AuditUploader() {
echo "Uploading qhub_audit.csv to $HOST..."
curl -v -T qhub_audit.csv -# ftp://$USER:$PASSWD@$HOST/ -m 10
if [ "$?" -ne "0" ]
then
echo "ERROR: Cannot upload qhubload.csv via FTP"
if [ ${term} = "tty1A" ]
then
echo "Attempting to download to modems server..."
wermit -s qhub_audit.csv
if [ $? -ne 0 ]
then
echo "Cannot upload to modems either!"
echo "This file will have to be downloaded manually"
exit 1
else
clear
echo "qhub_audit.csv has been put on modems server successfully"
tput cup 5 5
echo "Copy and paste this link into START -> RUN to download:"
tput cup 7 5
echo "\\\\\\xxxxxxxx\download\general\qhub_audit.csv"
read LINK
fi
else
echo "Upload failed!"
exit 1
fi
else
clear
echo "qhub_audit.csv has been put on $HOST successfully"
tput cup 5 5
echo "Copy and paste this link into internet explorer to download:"
tput cup 7 5
echo "ftp://$USER:$PASSWD@$HOST/qhub_audit.csv"
read LINK
fi
}
#######################################################
# Function to prompt user to upload qhub audit report #
#######################################################
AuditUpload() {
clear
echo "Audit report generated successfully"
echo ""
echo "Do you wish to upload qhub_audit.csv? (y/n):"
read REPLY
case "$REPLY" in
Y) AuditUploader; Auditvi; exit;;
y) AuditUploader; Auditvi; exit;;
N) Auditvi; exit;;
n) Auditvi; exit;;
*) echo "invalid option";;
esac
}
######################################
# Function to view qhub audit report #
######################################
Auditvi() {
if [ "$?" -ne "0" ]
then
exit 1
else
clear
echo "Do you wish to view qhub_audit.csv? (y/n):"
read REPLY
case "$REPLY" in
Y) vi qhub_audit.csv; exit;;
y) vi qhub_audit.csv; exit;;
N) exit;;
n) exit;;
*) echo "invalid option"; Pause; Auditvi;;
esac
fi
}
再次感谢各位的帮助。什么是AuditUploader和Auditvi?不断重复声音,好像有什么东西在向它输入空字符串(或按enter键发送垃圾邮件)。在函数的开头添加
set-x
,这样你就可以跟踪它在做什么这就是@chepner在他的第一个问题中的目的:他想知道那些函数是什么(AuditUpload
和Auditvi
)事实上是这样。如果它们很小,那么也许可以在你的问题中发布它们的源代码,而不是注释,这样它们就更容易阅读。有趣的是,根据你的注释,当你点击无限循环时,它们看起来甚至没有被执行。我假设你只是在命令提示符下运行AuditUpload
?