下方向键_Bash使用$#x27;...#x27;来捕获方向键
引言
前文已经指出echo如果想要输出转义字符,需要带上一个-e
的选项,否则转义字符将会原样输出。具体示例可见下图:
那么我有一个小问题了,能不能不给-e
的选项,然后还要打印转义字符?
我能不能不给你点赞,然后还让你注意到我? ——@StableGenius
解决办法
bash可以使用$'...'
将一个八进制数或十六进制数对应的ASCII字符赋值给一个变量,比如说字符A
的八进制ASCII码为0101,十六进制码为0x41。看具体的示例:
那么这个小知识点和引言当中的问题有啥关系呢?关键在于:许多转义字符本身就是有对应的ASCII码的,比如说换行键的ASCII码就是012(八进制)、10(十进制)、0x0A(十六进制),我们可以用$'...'
把它表现出来。看示例:
注意到上图的echo
并没有使用-e
的选项,但还是输出了换行符。
现在我又有了一个小问题,那就是:我不知道ASCII码是啥,我也不想百度,我就想用n
表示换行,同时我不想用-e
的选项,可以么?
你把头伸过来,我给你看个宝贝。 —— @StableGenius
解决办法 Plus
其实是可以办到的,只要我们把单引号里面的内容换成相应的转义字符就可以了。比如:换行符的转义字符是n
,那么你就可以用$'n'
来表示换行符了。来看示例:
很明显,我们就实现了最开始想要的东西:在不使用-e
选项的前提下,打印出相应的转义字符。事实上,上面的例子还可以进行进一步的精简:
能够看出双引号的存在会影响$'...'
的发挥,不带双引号好像又不太好,所以建议还是新定义一个变量,然后再用双引号括起来。
闭嘴,你已经没有小问题了!——@StableGenius
实例应用一
现在问题来了,这玩意有啥用?我带上一个-e
的选项不就搞定一切了嘛。答案就是:
源代码开源给你,你又能怎么样? ——@$'x53'$'x74'$'x61'$'x62'$'x6c'$'x65'$'x47'$'x65'$'x6e'$'x69'$'x75'$'x73'
实例应用二——捕获键盘方向键
在我做的简单的Bash版贪吃蛇小游戏当中,无法使用方向键来控制蛇的走位,因为我不会捕获方向键。大白话就是,我不知道怎么判断我是不是按下了一个方向键。
首先,我们要明白的一个问题是,啥是方向键?或者说,当我按下键盘的方向键时,我的键盘到底向电脑主机发送了什么玩意?
当我们按下w
这个键的时候,键盘大概就是翻一下字典,看看w
的ASCII码是多少,然后算算它的二进制表示方法,最后向主机发送了一系列电信号。是不是我按下方向键的时候,键盘翻的不是ASCII字典,而是日露辭典呢?
其实方向键它不是一个键,它是"三个键",本专栏的第一篇文章就简要地介绍过ANSI控制码,其中有提到:
ANSI控制码可以实现对光标的控制,比如:向上移动光标n行:
e[nA
。
当我们按下方向键时,键盘向主机发送的内容是一个ANSI控制码,其具体内容是ESC [ A
,表示光标向上移动一行。老铁们可以在自己的终端里面先按Ctrl+V
,再按一个方向键,就能够看到方向键向电脑发送的信号了,可见下图:
现在我们就知道如何捕获方向键了,那就是从键盘处依次读取三个字符,如果其顺序分别是ESC
、[
和A
,那么我们按下的键就是向上的方向键了。核心代码如下所示:
read -sn1 -p "请按下一个按键" key
if [[ $key == $'e' ]] ; thenecho "我有预感,你按下的不是一个普通的按键"# 如果真的是方向键,三个连续的信号间隔会非常短,所以定一个非常小的间隔read -sn1 -t 0.01 keyif [[ "$key" == "[" ]] ; thenecho "有内味了!"read -sn1 -t 0.01 keycase $key inA)echo "你按下了向上的方向键";;B)echo "你按下了向下的方向键";;C)echo "你按下了向右的方向键";;D)echo "你按下了不是向上,不是向下也不是向右的方向键";;esacelseecho "就这样结束了吧"fi
elseecho "你按了一个普通的按键,它是$key"
fi
小结
如果不使用$'...'
,我们没有办法把一个转义字符装进一个变量当中,以ESC
的转义字符e
为例,'e'
和"e"
都是表示由和e
构成的字符串,只有$'e'
才是ESC
本身。其他按键,比如PageUp
和Insert
也可以通过类似的方式来判断。
$'...'
的更多用途还需要在以后进一步的学习中再慢慢发现。
参考资料
Advance Bash-Scripting Guidebook.douban.com
mydzor/bash2048github.com
Python Shell 中敲击方向键显示「^[[C^[[D」,原因是什么?如何修复?www.zhihu.com
下方向键_Bash使用$#x27;...#x27;来捕获方向键相关推荐
- Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法
这里写自定义目录标题 Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法 Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法 近来, ...
- 3198元起!vivo X27/X27 Pro发布 升降摄像头+4800万三摄
昨晚,vivo在海口举行新品发布会,正式发布X27及X27 Pro.vivo X27拥有弹出式前置镜头设计,无刘海全面屏.金属中框与炫彩设计的玻璃后盖.机身厚度8.95毫米,机身自重188克. viv ...
- WPF下如何去除WebBrowser的滚动条和捕获关闭事件
方法一:适用于VS2008 1.在解决方案中添加"引用" 选择 COM 下的 Microsoft html object library 2.引入命名空间 us ...
- localhost 已拒绝连接_MySQL连接错误:Access denied for #x27;root#x27;@#x27;localhost#x27;
问题描述:笔者在Mac安装MySQL,但是当我连接到localhost本地服务器却被拒绝 mysql -u root -p(1045, "Access denied for user 'ro ...
- string数组转map_[#x27;1#x27;, #x27;2#x27;, #x27;3#x27;].map(parseInt) 映射解析
parseInt(string,radix) 将一个字符串 string 转换为 radix 进制的整数,radix为介于2-36之间的数. 参数: string要被解析的值.如果参数不是一个字符串, ...
- java判断键盘按键按下_在Java中检测并操作键盘方向键
vladr.. 5 不幸的是,这是不可能以便携的方式: 在Windows上,从System.in读取将被阻止,直到enter被按下,即使您不使用BufferedReader.箭头将循环显示命令历史记录 ...
- activex传字符串数组_JS中的数组以及数组的#x27;增#x27;,#x27;删#x27;,#x27;改#x27;,#x27;查#x27;
JS中的数组简介 JS中一共有七种数据类型:number,string,null,undefined,Boolean,symbol以及Object,其中数组属于object,js数组不是典型的数组,因 ...
- mac安装mysql mysql命令找不到_mysql报错Access denied for user #x27;root#x27;@#x27;localhost#x27;...
mac下安装mysql 8.0.16,连接出现Access denied for user 'root'@'localhost' (using password: YES): 第一步:苹果->系 ...
- mysql 删除时间一个星期_解决mysql“Access denied for user #x27;root#x27;@#x27;localhost#x27;”...
# mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usi ...
最新文章
- 运营书籍:新媒体运营实战笔记
- Go 语言:The Laws of Reflection 中文版
- 《POSIX多线程程序设计》读书笔记
- chown -R命令的使用
- Leet Code OJ 66. Plus One [Difficulty: Easy]
- git 几种还原版本_Git恢复之前版本的两种方法reset、revert(图文详解)
- 吴恩达机器学习 —— 2.7 计算图
- java设置jdk环境变量
- 今天开始写一些内容,留作备份。
- 设计模式之Prototype(原型)
- CSS中clear:both用法及事例
- DB2报错原因汇总(sqlcode sqlstate)
- 【js特效】一款不错的flash视频播放器
- CAD(2007)学习笔记
- 库克考虑卸任苹果 CEO,谁会是下一任接班人?
- Python-练习 43. 面向对象的分析和设计基础
- Nexus私服 (一)
- 爪哇国新游记之十六----泛型单链表类
- TpLink路由访问控制
- 【笔记】MS5837-30BA压力传感器调试笔记