Bash:以字符串格式设置环境变量

isa*_*aac 1 bash curl environment-variables string-formatting

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

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

Cha*_*ffy 5

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

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

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

这种方法的一个变体,避免了在文档内容中混合语法引号的需要,是使用不带引号的 heredoc,正如@chepner 在评论中所建议的

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

更好的答案是使用一种工具,它知道如何格式化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
Run Code Online (Sandbox Code Playgroud)

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