Bash

如何以“ANSI-C”方式從變數傳遞換行符?

  • October 31, 2019

如果我執行此程式碼

#!/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",但我可以在它和命令執行之間添加程式碼。

對我來說的方式是

#!/bin/bash

set -x

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

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

$'...'在變數賦值中使用,如

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%.}

然後像往常一樣使用結果變數。

引用自:https://unix.stackexchange.com/questions/549666