/bin/sh(dash)与bash中echo换行差异的解决方法问询
解决dash与bash中echo输出JSON换行符不一致的问题
这个问题的核心在于不同shell中echo命令对转义字符的处理行为差异:dash(你的/bin/sh)默认会解析字符串中的转义序列(比如\n),而bash的echo默认不会解析这些转义,所以才出现了两种环境下输出不同的情况。
要让两种shell都保留JSON中的字面量\n,可以用以下两种可靠的方法:
方法1:用printf代替echo(推荐)
printf的行为在POSIX标准中定义得更严格,不同shell的一致性更好,不会自动解析转义字符(除非你主动使用%b格式符)。把你的echo $r改成:
printf '%s\n' "$r"
这里的%s会原样输出变量r的内容,包括所有字面量的转义字符,最后加\n是为了输出后换行保持格式。
方法2:带引号使用echo并指定参数(兼容性稍差)
如果你坚持用echo,可以在dash中使用echo -n输出内容,再单独加换行;同时要给变量加上双引号,避免shell的分词处理:
echo -n "$r"; echo
不过要注意,echo的参数(比如-n)在不同shell中可能有细微差异,所以还是printf更稳妥。
为什么原来的写法有问题?
当你用echo $r时,首先shell会对变量r做无引号展开:会把字符串中的空白字符(包括实际换行)作为分隔符拆分内容,然后echo会把这些拆分后的部分用空格连接输出。再加上dash的echo会解析转义序列,就导致了\n被转换成实际换行;而bash的echo默认不解析转义,所以保留了\n字面量。给变量加上双引号echo "$r"可以避免分词问题,但dash的echo还是会解析转义,所以最好还是用printf。
内容的提问来源于stack exchange,提问作者George Robinson
相关产品推荐
相关产品推荐

