我正在尝试制作一个循环,直到按下逃逸键为止,但是我在打印读取的消息时遇到了麻烦,因为如果除Enter键之外的任何键,它将继续在一行中打印
这是我的代码:
while : ; do
read -n1 -r -p "Press esc key to continue...\n" key
[[ $key != $'\e' ]] || break
done
它输出Press esc key to continue...\n
答案 0 :(得分:1)
您可以使用$'...'
字符串,就像已经用于检测转义字符一样:
while : ; do
read -n1 -r -p $'Press esc key to continue...\n' key
[[ $key != $'\e' ]] || break
done
根据man bash
:
$'string'形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C的规定替换反斜杠转义字符 标准。反斜杠转义顺序为
\n
,\t
,\e
等。
答案 1 :(得分:0)
我只需要重组一下!
1。)输入消息(“按esc键继续...”)不应包含嵌入式换行符。我假设此换行符应在用户按下转义后出现。
1a。)我们也不想在屏幕上弹出用户输入,因此在回显-n(没有换行符)后,请静静地读-s。
原文:
read -n1 -r -p "Press esc key to continue...\n" key
已修改:
echo -n "Press esc key to continue..."; read -s -n1 -r key
2。)现在,当用户按下ESC时,我相信您想启动换行并退出循环,因此只需在ESC按键上回显并中断即可。景气。
2a。)关于所有问题,但转义符会重新打印消息...好吧,如果用户未命中转义符,让我们进行回车,这样消息将打印在同一位置而不是在新的一行上!
原文:
[[ $key != $'\e' ]] || break
已修改:
if [[ $key == $'\e' ]];then echo;break; else echo -ne "\033[0K\r"; fi
完成版本:
while : ; do
echo -n "Press esc key to continue..."; read -s -n1 -r key
if [[ $key == $'\e' ]];then echo;break; else echo -ne "\033[0K\r"; fi
done
让我知道这是否对您有用!