我正在尝试做简单的
Do you want to do that? [Y,n] _
bash中的问题。
我试过
echo "Do that? [Y,n]"
read DO_THAT
if ["DO_THAT"="y"]; then
do_that
fi
但失败了:bash: [y=y]: command not found
我做错了什么?!
答案 0 :(得分:45)
您可以考虑显式提示:-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
答案 1 :(得分:8)
echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
echo "do that"
else
echo "don't do that"
fi
密切关注if条件的语法和间距,它在bash中一直得到我:)
答案 2 :(得分:6)
在bash中查找read
的选项 - 您可以执行提示等。
read -p "Do that? [Y,n]" -i Y input
对于其余部分,请在命令名称周围留出空格('['是一个命令 - 您甚至可以在/bin/[
中找到它,尽管它也是内置的shell)和参数。
Bash手册,第4章:Shell内置命令
读
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
从标准输入或从提供的文件描述符fd读取一行 作为'-u'选项的参数,第一个单词分配给第一个单词 名字,第二个单词到第二个名字,依此类推,剩下的单词和 他们的干预分隔符被分配到姓氏。如果单词较少 从输入流读取而不是名称,分配剩余的名称 空值。 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读取完全nchars字符后的返回值而不是 等待完整的输入线,除非遇到EOF或 读出时间。输入中遇到的分隔符是 没有特别处理,并且在nchars之前不会导致读取 字符被阅读。
-p prompt在尝试之前显示提示,没有尾随换行符 阅读任何输入。仅在输入到来时才会显示提示 来自终端。
-r如果给出此选项,则反斜杠不会作为转义字符。 反斜杠被认为是该行的一部分。特别是,a 反斜杠 - 换行符对不能用作续行。
-s静音模式。如果输入来自终端,则字符不是 呼应。
-t超时 如果完整的输入行,则会导致读取超时并返回失败 在超时秒内未读取。超时可能是小数 小数点后面的小数部分的数字。这个 选项仅在读取终端读取输入时有效, 管道或其他特殊文件;从常规阅读中没有效果 文件。如果timeout为0,则如果输入可用,则read返回成功 指定的文件描述符,否则失败。退出状态是 如果超过超时,则大于128。
-u fd从文件描述符fd。
中读取输入
答案 3 :(得分:4)
您需要在“if”和变量之间放置一个空格:
if [ $var == "y" ]; then
echo "ese era el problema"
fi
答案 4 :(得分:1)
您可以使用大小写修改操作符:
if [ "${DECISION^^}" = "Y" ]; then
...
fi
您可以在“参数扩展”下的bash手册中找到更多信息。