如何以“ANSI-C”方式从变量传递换行符?

如何以“ANSI-C”方式从变量传递换行符?

如果我运行这段代码

#!/bin/bash

set -x

http --json http://example.com \
    value=$'hello\r\n\r\nworld'

我在标准输出中有两个回车符value

http --json http://example.com 'value=hello

world'

但是,如果我value在变量中有字符串,我找不到在标准输出中获取相同字符串的方法。例如,如果我运行

#!/bin/bash

set -x

variable="hello\r\n\r\nworld"

http --json http://example.com \
    value=$''"$variable"''

我没有换行符而是\r\n\r\n字符

http --json http://example.com 'value=hello\r\n\r\nworld'

如何从变量内的值开始换行?

我无法更改variable="hello\r\n\r\nworld",但我可以在它和命令运行之间添加代码。

答案1

对我来说就是这样

#!/bin/bash

set -x

variable="hello\r\n\r\nworld"

http --json http://example.com \
    value="${variable@E}"

答案2

要么在变量赋值中使用$'...',如

variable=$'hello\r\n\r\nworld'

代替

variable="hello\r\n\r\nworld"

或者用于printf处理转义符(这应该在任何 POSIXy shell 中工作):

escaped="hello\r\n\r\nworld"
raw=$(printf "%b" "$escaped")

但请注意,命令替换会吃掉最后的换行符(如果有的话),因此您可能必须通过在末尾添加和删除虚拟字符来解决这个问题:

escaped="hello world\n"
raw=$(printf "%b." "$escaped")
raw=${raw%.}

然后照常使用结果变量。

相关内容