コマンドラインで環境変数を利用する文字列をどのようにフォーマットしますか?例えば、私はすなわち、いくつかの変数をカールして渡したい:Bash:文字列内の環境変数をフォーマットする
curl -X POST --data-urlencode 'payload={"text": "I want to print an environment variable here, eg a path: $PATH"}' https://someapi.com/
コマンドラインで環境変数を利用する文字列をどのようにフォーマットしますか?例えば、私はすなわち、いくつかの変数をカールして渡したい:Bash:文字列内の環境変数をフォーマットする
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/
は注目すべきことに、これは、単一の使用はまだです外側の引用符(つまり、ペイロードを変更する必要はありません)がありますが、は二重引用符で始まるの末尾にで始まり、その二重引用符で置換を埋め込みます一重引用符。二重引用符は、構文上ではなくリテラルにすることができます。埋め込まれた)。
文書の内容に混入構文引用符の必要性を回避するこのアプローチ、上のバリアント、引用符で囲まれていないヒアドキュメントを使用することで、as advised by @chepner in the comments:
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
この方法:以下の例を考えてみましょう。
結果を有効なJSONにすることを目的としている場合、それは正しい方法ではないでしょう。フォーマット対応のツールを使用すると驚くべきPATH値を使用すると内容が無効になることがあります)、またはあなたのペイロードへの注入攻撃(最悪の場合)。 –
パス変数を実際には使用していません。あなたのご意見ありがとうございます。 – isaac