echo 在 /bin/sh 和 /bin/bash 之间以不同方式打印“\n”

echo prints "\n" differently between /bin/sh and /bin/bash

我有一个 shell 脚本,它从 cURL 中读取多行 JSON 字符串:

r=$(curl -H "X-Vault-Token: $VAULT_TOKEN" -fs $VAULT_ADDR/v1/)

如果我 运行 echo $r 并使用 /bin/sh 执行脚本,我看到 JSON 中的换行符被解释为换行符:

{"data": {"value": "foo
bar"}}

但是当我用 /bin/bash 执行脚本时,换行符是文字:

{"data": {"value": "foo\nbar"}}

我希望在使用 /bin/sh/bin/bash 时换行符是文字。如何阻止 /bin/sh 解释换行符?

file -h /bin/sh
/bin/sh: symbolic link to dash

使用 printf 而不是 echo

printf '%s\n' "$r"

来自POSIX spec for echo

It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.

强烈建议完整阅读“应用程序使用”部分。