这是我的 case 函数的一个例子:
function SendToScreen(){
echo -e "$*"
}
所以我这样调用它:
SendToScreen "Hello"
而且,如果我想添加颜色代码:
VioletForeGroundColor="\033[38;5;99m"
NormalColor="\033[0m"
SendToScreen "Hello"$VioletForeGroundColor" violet "$NormalColor" word."
这给了我一个正确的:
但是如果我想发送一些 DOS 类型的路径(包括 \
斜杠),问题 就来了:
VioletForeGroundColor="\033[38;5;99m"
NormalColor="\033[0m"
MyDOSPath="d:\vivisector"
SendToScreen "Hello"$VioletForeGroundColor" violet "$NormalColor" word. The path is $MyDOSPath"
因为\v
是某种ANSI代码,所以这次我得到:
我需要我的函数来输出彩色文本(粗体、草书、下划线...等),所以我必须使用 echo -e
。
我怎样才能解决这样烦人的控制代码与 \v
这样的字符冲突的问题(我想还会有其他的)?
我想通过修改函数来修复问题,但我不确定这是不是正确的方法。
谢谢。
EDIT-1:我们将选择 \033
也称为 \e
作为唯一需要保留的 ANSI 代码。
最佳答案
新答案:
function SendToScreen() {
echo -e $(echo "${*//\\/\\\\}" | sed 's/\\\\033\[/\\033\[/g');
}
这个转义所有内容,然后取消转义任何看起来像颜色序列 (\033[) 的内容。将文件名作为颜色序列发送的可能性大大降低。您可以通过仅将您想要允许的那些颜色序列列入白名单,并将 sed 命令更改为一系列 sed 命令来进一步减少它,这些命令将取消转义那些确切的序列。
旧答案: 假设你想转义\v 和\n,你可以这样做:
function SendToScreen(){
a="${*//\\v/\\\\v}"
a="${a//\\n/\\\\n}"
echo -e "$a"
}
您可以使用您不想处理的任何其他转义来扩展它。
关于Linux Bash shell : Leaving some ANSI codes (moSTLy color) and not interpreting some others from string in a function call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095449/