我遇到一个问题,即无法在函数内部暂停并等待用户确认以继续或退出脚本,背景是我正在编写一个验证函数,该函数针对输入文件进行验证,当遇到输入错误时我希望它暂停输入的特定值,理想情况下,它能够临时挂起该功能并向用户提供包含Continue
或Exit
的菜单,只有在用户选择该功能后,该命令才能恢复执行或脚本终止。
创建一个示例进行测试,从Press space to continue和How do I prompt for Yes/No/Cancel input in a Linux shell script?得到一些想法,作为我的测试,仅忽略read
命令行(假设该脚本暂停功能并等待)就无法正常工作用户输入。
test.sh
#!/bin/bash
function pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
function wait_user_confirm() {
echo "When encounter number 2 ask user to confirm continue"
while IFS= read -r line; do
if [[ "$line" -eq 2 ]]; then
pause # Not pause the function till user input and ignored by script
else
echo "Skip"
fi
done < "input.txt"
}
wait_user_confirm
input.txt
1
2
3
测试结果:
When encounter number 2 ask user to confirm continue
skip
skip
我测试了read
单独的命令(不在函数内,仅直接作为命令行),它可以正常工作,不是因为read
命令引起的问题,这是因为它无法在Shell脚本功能中暂停。如何通过提供选择菜单适当地暂停Shell脚本的功能并等待用户输入?感谢所有帮助,谢谢
答案 0 :(得分:3)
这里的问题是您的两个read
调用都在同一个输入文件句柄(重定向的input.txt
)上工作,而您打算将pause
函数从原始文件中读取而是标准输入句柄。
要解决此问题,例如,您可以对input.txt
文件使用不同的fd(例如4),如下所示:
# (...)
function wait_user_confirm() {
while IFS= read -ru4 line; do
# (...)
done 4< "input.txt"
}
(请注意传递给read的-u4
并最后重定向到fd 4)