`
hegz
  • 浏览: 442801 次
  • 性别: Icon_minigender_1
  • 来自: 茂名
社区版块
存档分类
最新评论

如何在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

    在示例代码末尾,调用了 `system("pause")` 使得程序暂停,等待用户按下任意键继续。这是一种常见的调试技巧,尤其是在控制台应用程序中,以便查看程序的输出结果。 以上就是从给定文件的标题、描述以及部分内容中...

    LINUX/UNIX Shell编程大作业

    在你的shell程序全部完成后你可以自己编三条记录添加到passwd文件中。 你的delete脚本文件  当用户在主菜单中选择7时,你的delete脚本文件必须被调用。下面是示例:   (主菜单如下) 你的选择:7(用户输入) ...

    通过打开现有的用户运行应用程序,使用批处理程序自动按任意键

    本篇将详细解释如何通过批处理程序和VBScript实现自动按任意键的功能,这对于那些需要手动按下任意键来继续执行的程序尤其有用。 **批处理程序(Batch Script)基础** 批处理程序是一种基于DOS命令行的脚本语言,...

    基本的shell脚本学习资料

    - **指令和文件名补全:** 用户可以通过按Tab键实现命令、路径或文件名的自动补全,提高输入效率。 - **别名:** Bash允许用户创建自定义的别名,将较长或复杂的命令简化为容易记忆的形式。例如,可以通过`alias ll=...

    pause between in win and unix

    通过使用`ncurses`,可以在程序中实现接收任意键输入的功能。 - **代码示例**: ```cpp #include int main() { initscr(); // 初始化ncurses cbreak(); // 设置非缓冲模式 noecho(); // 不显示用户输入 ...

    windows下shell语言.pdf

    pause 命令用于暂停批处理文件的执行,直到用户按下任意键继续。exit 命令用于终止批处理文件的执行。 例如: pause exit 14.批处理文件中的循环控制命令 for /f 用于对文件或命令的输出进行循环处理,使用tokens和...

    c c++ 让系统实现暂停 解决控制台一闪而过

    当用户按下任意键后,程序会继续执行。 - 这种方法的优点在于其实现简单、易于理解。但是,它依赖于操作系统的支持,可能不适用于所有平台(如Linux或macOS)。 ### 方法二:使用`cin`获取输入 除了使用`system()`...

    ddos 批处理教程

    .(或:请按任意键继续. . .) Sample:@echo off: begin copy G:*.* d:\back echo 请插入另一张光盘... pause goto begin 4. Call 命令:从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call ...

    免安装程序添加右键菜单

    3. **创建新的子键**:在`*`下新建一个名为`shell`的键,然后在其下继续创建一个新的子键,如`Openwithfoxe`。这里的名字可以根据实际需求命名,例如,如果希望在右键菜单中显示“用Foxe打开”,则命名为`...

    易语言程序免安装版下载

    修改BUG:矢量动画支持库中的“矢量编辑框”组件在光标位于组件左上角时按左光标键进入前一行可能会导致显示错误或内存申请失败。 11. 修改BUG:网络传送支持库在使用代理下载时可能会导致程序崩溃。 12. 修改BUG...

    vc++ 开发实例源码包

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 1:综合FTP下载和HTTP(网络蚂蚁)(多线程). 2:FTP下载支持多个站点同时下载一个文件(同时支持断点续传). 3...

    无涯教程(LearnFk)-批处理教程离线版.pdf

    PAUSE命令暂停执行并显示消息,等待用户按任意键继续;MD命令创建新目录;DEL命令删除文件;DIR命令列出目录内容;REN命令重命名文件和目录;MOVE命令移动文件或目录;TYPE命令显示文本文件内容。 在编写批处理文件...

    05.pdf

    - `RETURN`: 按下回车键,用于提交命令。 在命令行中,各个元素之间通常需要有空格分隔。 #### 二、命令行参数详解 命令行参数可以根据其是否必需分为两类:必需参数和可选参数。 **2.1 必需参数** 必需参数是...

    右键添加cmd方法

    - **个性化需求**:如果您希望在右键菜单中添加更多的命令选项,可以通过类似的方法进行扩展,只需在`shell`目录下继续添加新的子项即可。 #### 六、总结 通过本文介绍的方法,用户可以在Windows XP和Windows 7...

    C#实现将记事本中的代码编译成可执行文件的方法

    在Main方法中使用Console.WriteLine方法输出文本到控制台,并通过Console.ReadKey方法暂停程序,等待用户按任意键继续。 接下来,这个程序代码被保存为一个文本文件,文件名是HelloWorld.txt,保存的路径为F:\学习\...

    Windows电脑右键添加管理员身份运行

    在Windows操作系统中,"管理员身份运行"是一项重要的安全特性,它允许用户以具有更高权限的账户执行特定程序或任务,防止未授权的操作对系统造成潜在风险。然而,默认情况下,大多数程序并不需要或不会提示用户以...

    XP系统给dll和ocx添加右键注册反注册菜单

    在Windows XP系统中,动态链接库(DLL)和对象链接与嵌入控件(OCX)是非常重要的组件,它们通常用于提供各种功能和服务给应用程序。为了方便地注册或卸载这些组件,可以通过修改注册表来为DLL和OCX文件添加“注册”...

Global site tag (gtag.js) - Google Analytics