暂停循环并等待用户输入

时间:2020-08-23 19:18:06

标签: bash shell

我遇到一个问题,即无法在函数内部暂停并等待用户确认以继续或退出脚本,背景是我正在编写一个验证函数,该函数针对输入文件进行验证,当遇到输入错误时我希望它暂停输入的特定值,理想情况下,它能够临时挂起该功能并向用户提供包含ContinueExit的菜单,只有在用户选择该功能后,该命令才能恢复执行或脚本终止。

创建一个示例进行测试,从Press space to continueHow 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脚本的功能并等待用户输入?感谢所有帮助,谢谢

1 个答案:

答案 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)