引言

前文已经指出echo如果想要输出转义字符,需要带上一个-e的选项,否则转义字符将会原样输出。具体示例可见下图:

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的选项不就搞定一切了嘛。答案就是:

简单混淆后的Bash源代码

源代码开源给你,你又能怎么样? ——@$'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

现在我们就知道如何捕获方向键了,那就是从键盘处依次读取三个字符,如果其顺序分别是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本身。其他按键,比如PageUpInsert也可以通过类似的方式来判断。

$'...'的更多用途还需要在以后进一步的学习中再慢慢发现。

参考资料

Advance Bash-Scripting Guide​book.douban.com

mydzor/bash2048​github.com

Python Shell 中敲击方向键显示「^[[C^[[D」,原因是什么?如何修复?​www.zhihu.com

下方向键_Bash使用$#x27;...#x27;来捕获方向键相关推荐

  1. Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法

    这里写自定义目录标题 Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法 Win10数字小键盘按键变成方向键怎么办?Win10数字小键盘按键变为方向键解决方法 近来, ...

  2. 3198元起!vivo X27/X27 Pro发布 升降摄像头+4800万三摄

    昨晚,vivo在海口举行新品发布会,正式发布X27及X27 Pro.vivo X27拥有弹出式前置镜头设计,无刘海全面屏.金属中框与炫彩设计的玻璃后盖.机身厚度8.95毫米,机身自重188克. viv ...

  3. WPF下如何去除WebBrowser的滚动条和捕获关闭事件

    方法一:适用于VS2008 1.在解决方案中添加"引用"      选择 COM 下的 Microsoft html object library 2.引入命名空间      us ...

  4. localhost 已拒绝连接_MySQL连接错误:Access denied for #x27;root#x27;@#x27;localhost#x27;

    问题描述:笔者在Mac安装MySQL,但是当我连接到localhost本地服务器却被拒绝 mysql -u root -p(1045, "Access denied for user 'ro ...

  5. string数组转map_[#x27;1#x27;, #x27;2#x27;, #x27;3#x27;].map(parseInt) 映射解析

    parseInt(string,radix) 将一个字符串 string 转换为 radix 进制的整数,radix为介于2-36之间的数. 参数: string要被解析的值.如果参数不是一个字符串, ...

  6. java判断键盘按键按下_在Java中检测并操作键盘方向键

    vladr.. 5 不幸的是,这是不可能以便携的方式: 在Windows上,从System.in读取将被阻止,直到enter被按下,即使您不使用BufferedReader.箭头将循环显示命令历史记录 ...

  7. activex传字符串数组_JS中的数组以及数组的#x27;增#x27;,#x27;删#x27;,#x27;改#x27;,#x27;查#x27;

    JS中的数组简介 JS中一共有七种数据类型:number,string,null,undefined,Boolean,symbol以及Object,其中数组属于object,js数组不是典型的数组,因 ...

  8. 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): 第一步:苹果->系 ...

  9. 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 ...

最新文章

  1. 运营书籍:新媒体运营实战笔记
  2. Go 语言:The Laws of Reflection 中文版
  3. 《POSIX多线程程序设计》读书笔记
  4. chown -R命令的使用
  5. Leet Code OJ 66. Plus One [Difficulty: Easy]
  6. git 几种还原版本_Git恢复之前版本的两种方法reset、revert(图文详解)
  7. 吴恩达机器学习 —— 2.7 计算图
  8. java设置jdk环境变量
  9. 今天开始写一些内容,留作备份。
  10. 设计模式之Prototype(原型)
  11. CSS中clear:both用法及事例
  12. DB2报错原因汇总(sqlcode sqlstate)
  13. 【js特效】一款不错的flash视频播放器
  14. CAD(2007)学习笔记
  15. 库克考虑卸任苹果 CEO,谁会是下一任接班人?
  16. Python-练习 43. 面向对象的分析和设计基础
  17. Nexus私服 (一)
  18. 爪哇国新游记之十六----泛型单链表类
  19. TpLink路由访问控制
  20. 【笔记】MS5837-30BA压力传感器调试笔记

热门文章

  1. AIX 6.1 异步 I/O 的 配置与性能评估
  2. 黄聪:PHP网站流量统计开源程序大全
  3. Word 2007中隐藏段落和格式标记
  4. 6月 Python 开源项目 Top10,还不收藏~
  5. 彻底解决 intellij IDEA 卡顿 优化笔记
  6. 【转载】2009年春晚节目单提前揭晓
  7. linux终端传文件,如何使用Linux FTP命令传输文件
  8. 【学习笔记】ABAP OOD设计模式 - 桥接模式
  9. 详解边缘计算:为何而起、优势如何、哪些玩家以及正在爆发的场景
  10. ABAP 在字符串之间加入若干空格