Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中特殊字符的比较_Bash - Fatal编程技术网

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'