Bash: 在字符串中格式化环境变量

Bash: Format environment variables in string

如何在命令行中利用环境变量格式化字符串?例如,我想卷曲并传递一些变量,即:

curl -X POST --data-urlencode 'payload={"text": "I want to print an environment variable here, eg a path: $PATH"}' https://someapi.com/

简单的答案是更改您使用的引号类型:

curl -X POST --data-urlencode \
  'payload={"text": "I want to print an environment variable here, eg a path: '"$PATH"'"}' \
   https://someapi.com/

值得注意的是,这仍然在外部使用单引号(因此您不需要更改您的有效负载),但是它结束单引号,开始 双引号,并将您的替换嵌入这些双引号中(在结束它们并切换回单引号之前,可以在其中嵌入文字 - 而不是句法 - 双引号)。

这种方法的一个变体,避免了将句法引号混入文档内容的需要,是使用不带引号的 heredoc,:

curl -X POST --data-urlencode @- https://someapi.com/ <<EOF
payload={"text": "I want to print an environment variable here, eg a path: $PATH"}
EOF

更好 答案是使用知道如何格式化的工具JSON; jq 是一个广受欢迎的选择。考虑以下示例:

text="I want to print an environment variable here, eg a path: \"$PATH\""
curl -X POST --data-urlencode @- https://someapi.com/ <<EOF
payload=$(printf '%s\n' "$text" | jq -R '{text: .}')
EOF

这样你就可以保证有效的输出,即使你的环境变量包含反斜杠、文字引号、不可打印的字符或任何其他可能出现的字符。