2016-07-01 6 views
0

コマンドラインで環境変数を利用する文字列をどのようにフォーマットしますか?例えば、私はすなわち、いくつかの変数をカールして渡したい:Bash:文字列内の環境変数をフォーマットする

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

結果を有効なJSONにすることを目的としている場合、それは正しい方法ではないでしょう。フォーマット対応のツールを使用すると驚くべきPATH値を使用すると内容が無効になることがあります)、またはあなたのペイロードへの注入攻撃(最悪の場合)。 –

+0

パス変数を実際には使用していません。あなたのご意見ありがとうございます。 – isaac

答えて

3

簡単な答えは、あなたが使用している引用符のようなものに変更することです:

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 

この方法:以下の例を考えてみましょう。

+0

@Charlesがここにすべての拠点をカバーしているので、私の答えを削除しました。 – Cam

+0

標準入力からのデータを '--data-urlencode @ -'で読むこともできます – chepner

+0

また、' -R'オプションを使うと 'jq 'curl -X POST --date-urlencode @ - https:// someapi.com'。 – chepner

関連する問題