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