如何在 bash 中安全地转义变量字符串(用户输入)?

con*_*tti 0 bash gnu-screen string escape-characters

我有一个非常简单的类似聊天的工具,可以在 GNUscreen会话中运行。该screen窗口分成两部分,上部运行tail -f file.txt和底部运行具有下列内容的脚本:

#!/bin/bash
while : ; do
        read -p "Message: " msg
        ctime=$(date +"%H:%M:%S")
        echo "[${ctime}] User: ${msg}" >> file.txt
done
Run Code Online (Sandbox Code Playgroud)

非常简单,但可以根据我的要求完成工作。只有一个问题:当我按下ESC或 任何箭头键时,它会插入一个转义序列,^[[D例如。这会弄乱文件,导致糟糕的输出。

所以我的问题很简单:如何转义输入read以便写入文件是安全的?

我试过echo "[${ctime}] User: ${msg}" | strings >> file.txt这让它好多了,不再有大的混乱(例如没有被覆盖或错误地输出),但事情仍然不完美(例如输入te^[[Dst会变成te\n[Dst\n作为一个实际的新行) )。

Gor*_*son 5

稍微不同的方法怎么样?您可以允许用户使用它们来编辑输入行,而不是删除转义字符和序列read -e

如果需要,您可以通过记录聊天消息历史记录来进一步进行此操作,如下所示:

...
read -e -p "Message: " msg
history -s "$msg"
...
Run Code Online (Sandbox Code Playgroud)

有了这个,如果有人在消息中打错字,他们可以点击向上箭头,使用左右箭头来编辑和修复错字,然后点击返回以发送更正的消息。