我正在尝试在C中编写一个名为echo的小型echo程序,仅使用C STD库和C Posix库,基于对posix echo程序应该执行的操作的SUSv4描述。但是,在测试解析转义码时,我遇到了麻烦。
我的算法很简单,只需循环查看字符串字符数组,检查每个字符,查找“\”,如下面的代码段所示:
for(innerloop = 0;innerloop < strlen(singlestring);innerloop++)
{
if(singlestring[innerloop] == '\\' && innerloop + 1 < strlen(singlestring))
{
switch(singlestring[innerloop+1])
{
case 'a':
printf("\a");
break;
case 'b':
printf("\b");
break;
case 'c':
cescape = 1;
innerloop = strlen(singlestring);
break;
case 'f':
printf("\f");
break;
case 'n':
printf("\n");
break;
case 'r':
printf("\r");
break;
case 't':
printf("\t");
break;
case 'v':
printf("\v");
break;
case '0':
/*not implemented yet*/
break;
default: /*character = '\\'*/
printf("\\");
innerloop--;
break;
}
innerloop++;
}
else
{
printf("%c",singlestring[innerloop]);
}
}
这适用于大多数应用程序,但是当我开始调试转义码的逻辑时,我的麻烦特别是'\'。如果我从命令行传递给我的程序:
echo "Hello\nWorld"
结果如预期:
Hello
World
然而,当我在字符串中添加额外的'\'时:
echo "Hello\\nWorld"
结果对我来说意外,因为我预计输出为“Hello \ nWorld”,但我的gnu echo和busybox echo的基线似乎已经达成一致。
Hello
World
然而,分歧点出现在多个'\'
之后echo "Hello\\\nWorld"
我的结果:
Hello\
World
Gnu / Busybox的回声结果
Hello\nWorld
现在,模式会重复添加更多'\'字符。
我的算法是否存在根本缺陷且不符合POSIX规范,或者GNU和Busybox echo程序是否遵循POSIX标准还是两者的某种组合?
答案 0 :(得分:0)
此处发布的输出是否仅通过“回声”生成来自linux shell或程序的命令?如果它来自shell,shell可能会以不同的方式处理转义字符。
在这种情况下,传递给程序的输入也会有所不同,从而导致程序的结果/输出。
答案 1 :(得分:0)
如评论中所述,shell正在扩展转义。
BusyBox在几个方面与POSIX不同;如果echo
逃脱是其中之一,那就不足为奇了。顺便说一下它似乎不是一个GNU项目,所以它只是&#34; BusyBox&#34;。
与其他shell(包括bash 4.2)比较:
$ ksh
$ echo "Hello\\nWorld"
Hello\nWorld
$ bash
$ echo "Hello\\nWorld"
Hello\nWorld
$ dash
$ echo "Hello\\nWorld"
Hello
World
进一步阅读: