我想做的很简单
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)
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 :)
read在bash中查找选项- 您可以执行提示等.
read -p "Do that? [Y,n]" -i Y input
Run Code Online (Sandbox Code Playgroud)
对于其余部分,在命令名称周围留出空格('['是一个命令 - 你甚至可以找到它,/bin/[虽然它也是一个内置的shell)和参数.
Bash手册,第4章:Shell内置命令
读
Run Code Online (Sandbox Code Playgroud)read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]从标准输入读取一行,或从作为'-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读取输入.