如何在SHELL程序中实现‘按任意键继续’

问:我在写一个SHELL程序,可是遇到了一个难题, 在READ接受输入时,必须按回车键才能确认,而我需要只要按一个键就能得到用户的输入,无须按回车键!有什么好办法呢?

答:一个经典 的小难题,HERE you are:
把下面这个函数如法应用到你的程序中去吧。
#!/bin/sh

get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}

echo "Press any key to continue..."
char=`get_char`
如果你的机器上不认stty raw那么把函数中两处出现的raw换成cbreak。

问:如果是
while :
do
case
1)....;
2),....:
0)exit;
done
,输入1或2(不用敲回 车)就可以运行的话,有办法吗?

答:做成子程序来调用就好了,试试这个

  代码:
#!/usr/bin/ksh
get_char()
{
  SAVEDSTTY=`stty -g`
  stty -echo
  stty raw
  dd if=/dev/tty bs=1 count=1 2> /dev/null
  stty -raw
  stty echo
  stty $SAVEDSTTY
}
while : do
printf "press any key or RETRUN to quit: "
c=`get_char`
case "$c" in
  [0-9]) echo "this is digit $c";;
  [a-zA-Z]) echo "this is aphabet $c";;
  ^M) exit;;
  *) echo "Key undefined! ";;
esac
done

说 明:^M 的输入方法是 CTRL-V-M

dd if=/dev/tty bs=1 count=1 2> /dev/null

if 是源 设备/文件,这里表示从标准终端读入,
block size为 1,数目也为 1,所以就取到了一个字符

这 之前的和之后的一些 stty 语句主要是两个目的,
1、终端上不要 echo
2、保护现场,即做完dd后,即恢复原来的终端设置

去 掉 stty -echo
dd行改为:
echo `dd bs=1 count=1 2>/dev/null ` 即可
### 如何在 Shell 脚本中处理回车键 #### 判断用户输入中的回车键 为了检测用户是否按下了回车键而不输入任何其他字符,在读取输入时可以利用 `read` 命令配合特定选项实现这一功能。当仅按下回车而无额外输入时,所得到的字符串长度为零。 ```bash echo "请输入一些内容:" read input_variable if [[ -z "$input_variable" ]]; then echo "只按了回车" else echo "您输入的是: $input_variable" fi ``` 此段代码展示了如何通过 `-z` 测试条件来验证变量是否为空串[^1]。 #### 忽略多余的回车符 有时从 Windows 文件复制到 Unix/Linux 系统上的脚本可能会带有不兼容的行结束标记 `\r\n`(CRLF),这可能导致执行错误。可以通过多种方式去除这些不必要的 CR 字符: - 使用 `dos2unix` 工具转换文件格式; - 或者直接在脚本内部替换掉所有的 carriage return (`\r`) 符号; ```bash sed 's/\r$//' script.sh > new_script.sh chmod +x new_script.sh ./new_script.sh ``` 上述命令序列先移除了每一行结尾处可能出现的 `\r`,再赋予新创建的干净版本可执行权限并运行它[^2]。 #### 处理单个按键事件包括回车 如果目标是在交互式程序里捕捉单独击键动作,比如等待用户确认某个操作,则可以用带参数的 `read` 来完成这项工作。设置 `-n 1` 参数可以让 `read` 只接收一个字节的数据就返回控制权给后续逻辑流程。 ```bash echo "按任意键继续..." read -s -n 1 key # 不显示输入也不需敲回车提交 echo "" ``` 这里定义了一个简单的提示信息让用户知道应该做什么,并且采用了静默模式(`-s`)防止密码或其他敏感数据被泄露于终端上[^3]。 #### 自动化场景下的模拟回车 对于某些自动化任务而言,可能需要向子进程发送虚拟的键盘指令作为回应的一部分。例如使用 Expect 扩展工具可以在 SSH 登录过程中自动应答 yes/no 提问环节。 ```tcl #!/usr/bin/expect set timeout -1 spawn ssh root@X.X.X.X expect { "*continue*" { send "yes\r"; exp_continue } } interact ``` 这段 Tcl 风格的脚本片段说明了怎样构建一个能够响应远程主机询问是否继续连接对话框的小应用程序[^4]。 #### 解决因不当换行引起的语法问题 最后值得注意的一点是关于不同操作系统间存在的差异性所带来的潜在麻烦——特别是在移植由 Windows 编辑器保存下来的文本至 Linux 平台上来的时候。由于两者采用不同的行终止约定(CR/LF vs LF),所以偶尔会遭遇解析失败的情况。具体表现为类似于 `"syntax error near unexpected token '$'\r"` 的报错消息。解决办法同前面提到过的一样,即清理掉那些意外混入的CR符号即可恢复正常运作状态[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值