【问题标题】:How to use new line character in bash?如何在bash中使用换行符?
【发布时间】:2019-12-17 10:13:49
【问题描述】:

我正在尝试创建一个循环,该循环将一直循环,直到按下转义键,但我在打印读取消息时遇到了困难,因为如果有任何键,除了 enter 键,它将继续打印在一行中

这是我的代码:

while : ; do
    read -n1 -r -p "Press esc key to continue...\n" key
    [[ $key != $'\e' ]] || break
done

它输出Press esc key to continue...\n

【问题讨论】:

  • read 行中删除“\n”。在读取行之后添加echo -e "\n" 执行echo -e "\n"。您想打印新行 not 作为read 逻辑的一部分。 unix.stackexchange.com/questions/383197/…
  • echo "Press esc key to continue..."; read -n1 -r key

标签: linux bash linux-mint


【解决方案1】:

我会稍微重组一下!

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

测试它(一堆随机的 NON-ESCAPE 键):

让我知道这是否适合你!

【讨论】:

    【解决方案2】:

    您可以使用$'...' 字符串,就像您已经用于检测转义字符一样:

    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 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2011-01-27
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多