【问题标题】:Break a bash loop when [return] key is hit按下 [return] 键时中断 bash 循环
【发布时间】:2013-06-25 12:13:27
【问题描述】:

在 bash 中,是否有可能在按下 [Return] 键时退出不等待用户输入的循环?

这就是我的意思的那种循环。关键是 [q]。我希望它是[返回]。

#!/bin/bash

stty -echo -icanon time 0 min 0 # Don't wait when read the input

i=1

while [ 1 ]; do

   echo -ne "$i\r"

   ((i+=1))

   read key

   if [ "$key" == "q" ]; then break; fi # If [q] is hit, get out of the loop

done

stty sane # Come back to the classic behavior

exit 0

【问题讨论】:

  • 例如,在vim 中,您可以执行<Ctrl+v>,然后点击<return>,您应该会看到^M 字符。那就是您要与之比较的那个。
  • 您好,实际上@Brice 是正确的,他说当用户在“读取”命令期间仅输入 [Return] 时 $key 无效。但问题是,由于我的脚本的第三行(stty -echo ...),即使用户没有输入任何内容,$key 在“if”位置也是无效的。这个问题恐怕没有办法解决……

标签: bash loops break


【解决方案1】:

检查用户是否准确按下了 Return(又名 Enter)而不是 Ctrl+d,只需检查退出代码是否为零(因为 Ctrl+dCtrl+c 将导致非零退出代码)并且密钥为空:

if [ $? -eq 0 ] && [ -z "$key" ]
then
    break
fi

【讨论】:

  • 你做到了! :D :D :D 非常感谢! :)
【解决方案2】:

如果用户输入<return> 而不输入任何其他内容,$key 将是一个空字符串。

也只需检查空字符串:

if [ -z "$key" ]; then break; fi

根据the man page-z 告诉检查 零长度 字符串。

【讨论】:

  • -z 不会告诉if 检查零长度字符串。是test 命令检查它并返回真/假,if 然后对其进行操作。细微但重要的区别。
  • 嗨,brice,问题是由于第一行注释,如果用户没有按任何键,$key 是一个空字符串。所以什么时候点击[Return]没有区别。
  • @brice 不管你使用[[还是[(甚至test或者grep),if只是检查下面的命令是否返回零。
猜你喜欢
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
相关资源
最近更新 更多