bash用户输入if

frn*_*nhr 21 bash user-input

我想做的很简单

Do you want to do that? [Y,n] _
Run Code Online (Sandbox Code Playgroud)

bash中的问题.

我试过了

echo "Do that? [Y,n]"
read DO_THAT
if ["DO_THAT"="y"]; then
  do_that
fi
Run Code Online (Sandbox Code Playgroud)

但它失败了: bash: [y=y]: command not found

我究竟做错了什么??!

use*_*own 49

您可以考虑显式提示:-p并指定1-character-input -n1,允许在没有ENTER的情况下插入y.

read -n1 -p "Do that? [y,n]" doit 
case $doit in  
  y|Y) echo yes ;; 
  n|N) echo no ;; 
  *) echo dont know ;; 
esac
Run Code Online (Sandbox Code Playgroud)

  • @ekaj:不作为阅读或案例的选项.您可以使用循环将其包围或将其放在函数中并递归调用该函数,以强制执行匹配的答案. (3认同)
  • 太好了!+1我不知道你可以提示输入一个字母而不按下输入:) (2认同)
  • 如果你有一个"不知道"的情况,有没有办法回到"那样做?" 再次提示? (2认同)

Ken*_*son 10

echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
        echo "do that"
else
        echo "don't do that"
fi
Run Code Online (Sandbox Code Playgroud)

密切注意if条件的语法和间距,它让我一直在bash :)

  • [这是_very_ late但是]从技术上讲,你已经指出`Y`是默认选项,但如果输入是除了'Y`或'y`之外的其他东西,那么你的逻辑实际上"不会那么做".为了使你的回声更清晰,你应该说"做那个?[y/N]"或你的if语句应该改为检查`n` /`N`字符.+1因为你的答案更简单!:) (3认同)

Jon*_*ler 6

read在bash中查找选项- 您可以执行提示等.

read -p "Do that? [Y,n]" -i Y input
Run Code Online (Sandbox Code Playgroud)

对于其余部分,在命令名称周围留出空格('['是一个命令 - 你甚至可以找到它,/bin/[虽然它也是一个内置的shell)和参数.


Bash手册,第4章:Shell内置命令

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]  
       [-p prompt] [-t timeout] [-u fd] [name ...]
Run Code Online (Sandbox Code Playgroud)

从标准输入读取一行,或从作为'-u'选项的参数提供的文件描述符fd读取,第一个字分配给第一个名称,第二个字分配给第二个名称,依此类推,用剩余的单词和他们介入的分隔符分配到姓氏.如果从输入流中读取的字数少于名称,则为其余名称分配空值.IFS变量值中的字符用于将行拆分为单词.反斜杠字符'\'可用于删除下一个字符读取和行继续的任何特殊含义.如果未提供名称,则将读取的行分配给变量REPLY.返回代码为零,除非遇到文件结束,读取超时(在这种情况下返回代码大于128),或者提供无效文件描述符作为'-u'的参数.

选项(如果提供)具有以下含义:

-a aname将这些单词分配给数组变量aname的顺序索引,从0开始.所有元素在赋值之前从aname中删除.其他名称参数将被忽略.

-d delim delim的第一个字符用于终止输入行,而不是换行符.-e Readline(参见第8章[命令行编辑],第93页)用于获取该行.Readline使用当前(或默认,如果行编辑以前未激活)编辑设置.-i text如果使用Readline读取行,则在编辑开始之前将文本放入编辑缓冲区.

-n nchars读取nchars字符后返回返回,而不是等待完整的输入行,但如果在分隔符之前读取的字符数少于nchars,则遵循分隔符.

-N读取nchars字符之后的读取返回,而不是等待完整的输入行,除非遇到EOF或读取超时.输入中遇到的分隔符不会被特殊处理,并且在读取nchars字符之前不会导致读取.

-p prompt在尝试读取任何输入之前显示提示,没有尾随换行符.仅当输入来自终端时才会显示提示.

-r如果给出此选项,则反斜杠不会充当转义字符.反斜杠被认为是该行的一部分.特别是,反斜杠 - 换行符对不能用作行继续.

-s静音模式.如果输入来自终端,则不回显字符.

-t timeout如果在超时秒内未读取完整的输入行,则会导致读取超时并返回失败.超时可以是十进制数,小数点后面的小数部分.此选项仅在读取来自终端,管道或其他特殊文件的输入时有效; 从常规文件中读取时没有任何效果.如果timeout为0,如果输入在指定的文件描述符上可用,则read返回成功,否则失败.如果超出超时,则退出状态大于128.

-u fd从文件描述符fd读取输入.