下方向键_Bash使用$#x27;...#x27;来捕获方向键
引言
前文已經(jīng)指出echo如果想要輸出轉(zhuǎn)義字符,需要帶上一個-e的選項,否則轉(zhuǎn)義字符將會原樣輸出。具體示例可見下圖:
echo輸出轉(zhuǎn)義字符需要帶上-e的選項那么我有一個小問題了,能不能不給-e的選項,然后還要打印轉(zhuǎn)義字符?
我能不能不給你點贊,然后還讓你注意到我? ——@StableGenius解決辦法
bash可以使用$'...'將一個八進制數(shù)或十六進制數(shù)對應(yīng)的ASCII字符賦值給一個變量,比如說字符A的八進制ASCII碼為0101,十六進制碼為0x41。看具體的示例:
$'...'的用法那么這個小知識點和引言當中的問題有啥關(guān)系呢?關(guān)鍵在于:許多轉(zhuǎn)義字符本身就是有對應(yīng)的ASCII碼的,比如說換行鍵的ASCII碼就是012(八進制)、10(十進制)、0x0A(十六進制),我們可以用$'...'把它表現(xiàn)出來。看示例:
使用$'...'表示換行符注意到上圖的echo并沒有使用-e的選項,但還是輸出了換行符。
現(xiàn)在我又有了一個小問題,那就是:我不知道ASCII碼是啥,我也不想百度,我就想用n表示換行,同時我不想用-e的選項,可以么?
你把頭伸過來,我給你看個寶貝。 —— @StableGenius解決辦法 Plus
其實是可以辦到的,只要我們把單引號里面的內(nèi)容換成相應(yīng)的轉(zhuǎn)義字符就可以了。比如:換行符的轉(zhuǎn)義字符是n,那么你就可以用$'n'來表示換行符了。來看示例:
轉(zhuǎn)義字符的十八變很明顯,我們就實現(xiàn)了最開始想要的東西:在不使用-e選項的前提下,打印出相應(yīng)的轉(zhuǎn)義字符。事實上,上面的例子還可以進行進一步的精簡:
進一步精簡$'...'的使用能夠看出雙引號的存在會影響$'...'的發(fā)揮,不帶雙引號好像又不太好,所以建議還是新定義一個變量,然后再用雙引號括起來。
閉嘴,你已經(jīng)沒有小問題了!——@StableGenius實例應(yīng)用一
現(xiàn)在問題來了,這玩意有啥用?我?guī)弦粋€-e的選項不就搞定一切了嘛。答案就是:
簡單混淆后的Bash源代碼源代碼開源給你,你又能怎么樣? ——@$'x53'$'x74'$'x61'$'x62'$'x6c'$'x65'$'x47'$'x65'$'x6e'$'x69'$'x75'$'x73'實例應(yīng)用二——捕獲鍵盤方向鍵
在我做的簡單的Bash版貪吃蛇小游戲當中,無法使用方向鍵來控制蛇的走位,因為我不會捕獲方向鍵。大白話就是,我不知道怎么判斷我是不是按下了一個方向鍵。
首先,我們要明白的一個問題是,啥是方向鍵?或者說,當我按下鍵盤的方向鍵時,我的鍵盤到底向電腦主機發(fā)送了什么玩意?
當我們按下w這個鍵的時候,鍵盤大概就是翻一下字典,看看w的ASCII碼是多少,然后算算它的二進制表示方法,最后向主機發(fā)送了一系列電信號。是不是我按下方向鍵的時候,鍵盤翻的不是ASCII字典,而是日露辭典呢?
其實方向鍵它不是一個鍵,它是"三個鍵",本專欄的第一篇文章就簡要地介紹過ANSI控制碼,其中有提到:
ANSI控制碼可以實現(xiàn)對光標的控制,比如:向上移動光標n行:e[nA。當我們按下方向鍵時,鍵盤向主機發(fā)送的內(nèi)容是一個ANSI控制碼,其具體內(nèi)容是ESC [ A,表示光標向上移動一行。老鐵們可以在自己的終端里面先按Ctrl+V,再按一個方向鍵,就能夠看到方向鍵向電腦發(fā)送的信號了,可見下圖:
向上方向鍵對應(yīng)的內(nèi)容是ESC [ A現(xiàn)在我們就知道如何捕獲方向鍵了,那就是從鍵盤處依次讀取三個字符,如果其順序分別是ESC、[和A,那么我們按下的鍵就是向上的方向鍵了。核心代碼如下所示:
read -sn1 -p "請按下一個按鍵" key if [[ $key == $'e' ]] ; thenecho "我有預(yù)感,你按下的不是一個普通的按鍵"# 如果真的是方向鍵,三個連續(xù)的信號間隔會非常短,所以定一個非常小的間隔read -sn1 -t 0.01 keyif [[ "$key" == "[" ]] ; thenecho "有內(nèi)味了!"read -sn1 -t 0.01 keycase $key inA)echo "你按下了向上的方向鍵";;B)echo "你按下了向下的方向鍵";;C)echo "你按下了向右的方向鍵";;D)echo "你按下了不是向上,不是向下也不是向右的方向鍵";;esacelseecho "就這樣結(jié)束了吧"fi elseecho "你按了一個普通的按鍵,它是$key" fi代碼運行實例小結(jié)
如果不使用$'...',我們沒有辦法把一個轉(zhuǎn)義字符裝進一個變量當中,以ESC的轉(zhuǎn)義字符e為例,'e'和"e"都是表示由和e構(gòu)成的字符串,只有$'e'才是ESC本身。其他按鍵,比如PageUp和Insert也可以通過類似的方式來判斷。
$'...'的更多用途還需要在以后進一步的學(xué)習(xí)中再慢慢發(fā)現(xiàn)。
參考資料
Advance Bash-Scripting Guide?book.douban.commydzor/bash2048?github.comPython Shell 中敲擊方向鍵顯示「^[[C^[[D」,原因是什么?如何修復(fù)??www.zhihu.com 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的下方向键_Bash使用$#x27;...#x27;来捕获方向键的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青茶什么时候拆_为什么铁观音这么香?到底
- 下一篇: bsp模型适用于图计算_CODE V微信