【问题标题】:How to pass a value to read input before being prompted?如何在提示之前传递一个值来读取输入?
【发布时间】:2019-10-22 15:00:21
【问题描述】:

我有 shell 脚本提示回答 y/n。在给出输入之前的提示下,我使用了调用信号处理函数的 control-c 信号。在信号处理函数中有一个提示“q”退出或“y”和“y”应该与第一个读取提示一起使用。

我尝试(( echo "y" | read )),但没有成功

      ==========================================
           This is part of my script:

IntHandle ()

{ 
   echo -e "\nUse 'q' to quit "
   read var1 
   if [[ $var1 == q ]]
   then
        exit 1
   else
        echo "y" | read ----->here I need "y" to be an input to read prompt 
                             directly and being saved in "ans" variable in 
                             main body where I used control-c 
   fi
 }


trap 'IntHandle' SIGINT
read -p "no valid user id entered, new user ids? [y\n]: " ans ----> here 
                                  used control-c signal before give y/n to ans
if [[ $ans == "y" ]]
then 
     read -p " username :" name
fi
      .
      .
      .
      .
      .

=================

输出应如下所示:

没有输入有效的用户 ID,新的用户 ID? [y\n]: #control-c 输入

' 使用 'q' 退出 ' y ------> 这里 "y" 输入了 Siganl Handeling 中的 "q" 函数然后它被保存在“ans”变量中 条件为真提示用户名。

usernames: Larry -----> 真实条件后输入的名字。 . . .

【问题讨论】:

  • 4 个空格 before 脚本的每一行,以便其格式正确。在段落中将反引号(例如'`')与format as code 之间的内联代码括起来。 "============================""In main body of my script:" 不是您的脚本的一部分。

标签: shell


【解决方案1】:

代替

echo "y" | read

试试:

ans=y

需要在触发陷阱之前定义陷阱函数。所以我会把它移到文件的顶部。

函数完成后,控制权返回到被 Ctrl-C 中断的 read 语句。所以我会做而不是echo "y" | readans=y 是重新发出原始提示:

IntHandle ()
{ 
  echo -e "\nUse 'q' to quit "
  read var1 
  if [[ $var1 == q ]]
  then
       exit 1
  else
       echo -n 'no valid user id entered, new user ids? [y\n]: '
  fi
}

【讨论】:

  • 严格来说,函数只需要在陷阱触发之前定义,但由于你不知道什么时候触发,确保函数已定义。
  • 但这会重复提示“没有输入有效的用户ID,新的用户ID?[y\n]:”我无法删除原来的提示,因为它是我使用的if条件所必需的.关于函数的设置,我在脚本的开头使用了它,但在这里我把它放晚了,以便澄清。
  • @RedHat:如果用户按下 Ctrl-C 并且在退出提示符处输入“q”以外的内容,它只会复制提示符。您应该删除第一个read 及其提示。就澄清而言,我假设您的意思是为了发布您的问题。如果是这样,而不是澄清,它会造成混乱,因为它会导致脚本无法以与您尝试解决的问题不同的方式工作,并且如果您发布的代码与您实际使用的不同可能导致得到不适用的答案。
  • 谢谢丹尼斯。首先,我编辑了我发布的代码,将函数放在开头。但是,当我使用 control -c 信号时,它不应该像我被要求那样重复提示消息。而不是这样,当我输入“y”时,我应该直接提示“用户名”。感谢您的帮助尝试
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2017-06-26
相关资源
最近更新 更多