Bash中特殊字符的比较
我编写了一个函数,输出彩色输出,如下所示:Bash中特殊字符的比较,bash,Bash,我编写了一个函数,输出彩色输出,如下所示: foo() { local arrow="\033[1;32m↑\033[0m" echo "1$arrow" } 我想测试这个函数,所以我用它来做单元测试 test_foo() { local green_arrow="\033[1;32m↑\033[0m" assertEquals "1$green_arrow" "$(foo)" } 但shunit抱怨说:ASSERT:expected: 但是是:。我猜函数输出隐藏字符时会出现
foo() {
local arrow="\033[1;32m↑\033[0m"
echo "1$arrow"
}
我想测试这个函数,所以我用它来做单元测试
test_foo() {
local green_arrow="\033[1;32m↑\033[0m"
assertEquals "1$green_arrow" "$(foo)"
}
但shunit抱怨说:ASSERT:expected:<1↑> 但是是:<1↑>代码>。我猜函数输出隐藏字符时会出现问题
有没有办法去掉特殊字符,或者从变量中转义它们
编辑:
运行以下命令表明,\\033
转义字符正在被转换,可能是通过echo转换为文字\E
转义:
printf '%q' "1$green_arrow"
' 1\\033[1;32m?\206\221\\033[0m'
printf '%q' "$(foo)"
' 1\E[1;32m?\206\221\E[0m'
使用printf-v varname\u quoted%q“$varname”
获取内容的转义形式将提供一种更易于阅读和解释的形式,它也可以作为文本包含在代码中,无需额外引用或转义。(如果您的目标是将引用的内容发送到标准输出,而不是发送到另一个变量,则可以简化为printf%q“$varname”
)
也就是说,要将格式字符串转换为文字(在格式字符串中支持参数,例如,%s
,%02f
,等等):
printf-v绿色箭头'\033[1;32m↑\033[0m'
…或者,将反斜杠转义字符串(仅支持完整格式字符串语法的子集)转换为文字:
printf-v绿色箭头“%b”\033[1;32m↑\033[0m'
…然后,为了获得以转义的、人类可读的形式发出的文本,以便于比较和/或作为文本复制并粘贴到shell脚本中:
printf'%q\n'$green\u箭头“
将这一切结合在一起,以下是获得更可读的错误消息的一种方法(请原谅StackOverflow的语法突出显示,在撰写本文时,它并没有完全改变bash中嵌套引用上下文的工作方式):
test_foo(){
本地绿色箭头=$'\E[1;32m↑\E[0m'
assertEquals“$(printf'%q'”1$绿色箭头“$(printf'%q'$(foo)”)
}
…或者,更有效地(避免不必要的子shell):
test_foo(){
本地绿色箭头=$'\E[1;32m↑\E[0m'
本地期望答案引用实际答案引用
printf-v所需答案引述'%q'“1$绿色箭头”
printf-v实际答案引用的'%q'$(foo)”
assertEquals“$desired\u answer\u quoted”$actual\u answer\u quoted”
}
使用printf-v varname_quoted%q“$varname”
获取内容的转义形式将提供一种更易于阅读和解释的形式,它也可以作为文本包含在代码中,无需额外的引用或转义。(这可以简化为printf%q“$varname”
如果您的目标是将引用内容发送到标准输出,而不是发送到另一个变量)
也就是说,要将格式字符串转换为文字(在格式字符串中支持参数,例如,%s
,%02f
,等等):
printf-v绿色箭头'\033[1;32m↑\033[0m'
…或者,将反斜杠转义字符串(仅支持完整格式字符串语法的子集)转换为文字:
printf-v绿色箭头“%b”\033[1;32m↑\033[0m'
…然后,为了获得以转义的、人类可读的形式发出的文本,以便于比较和/或作为文本复制并粘贴到shell脚本中:
printf'%q\n'$green\u箭头“
将这一切结合在一起,以下是获得更可读的错误消息的一种方法(请原谅StackOverflow的语法突出显示,在撰写本文时,它并没有完全改变bash中嵌套引用上下文的工作方式):
test_foo(){
本地绿色箭头=$'\E[1;32m↑\E[0m'
assertEquals“$(printf'%q'”1$绿色箭头“$(printf'%q'$(foo)”)
}
…或者,更有效地(避免不必要的子shell):
test_foo(){
本地绿色箭头=$'\E[1;32m↑\E[0m'
本地期望答案引用实际答案引用
printf-v所需答案引述'%q'“1$绿色箭头”
printf-v实际答案引用的'%q'$(foo)”
assertEquals“$desired\u answer\u quoted”$actual\u answer\u quoted”
}
printf%q
是您的朋友,如果您想以可打印的形式查看此内容。也就是说:printf'将%q与%q进行比较\n'“1$green\u arrow”“$(foo)”
顺便说一句,在1
@CharlesDuffy-yep,显而易见的copypeat将修复之前,这里的前导空间存在明显的差异。%q
是一个很好的技巧,结果如下:将$1\\033[1;32m?\206\221\\033[0m]与$1\E[1;32m?\206\221\E]进行比较[0m'
此外,printf%q
的输出可以直接在源文件中用作赋值文本,因此可以使用green\u arrow=$'1\E[1;32m?\206\221\E[0m'
printf%q
是您的朋友,如果您想以可打印的形式查看此内容。也就是说:printf'将%q与%q进行比较\n'“1$green\u arrow”“$(foo)”
顺便说一句,在1
@CharlesDuffy-yep,显而易见的copypeat将修复之前,这里的前导空间存在明显的差异。%q
是一个很好的技巧,结果如下:将$1\\033[1;32m?\206\221\\033[0m]与$1\E[1;32m?\206\221\E]进行比较[0m'
此外,printf%q
的输出可以直接在源文件中用作赋值的文本,因此可以使用绿色箭头=$'1\E[1;32m?\206\221\E[0m'
。