curl のコマンド オプションに変数文字列を渡したいと思います。
if [ ! -z ${picture} ]; then APISTRING+="--data-urlencode \"picture=${picture}\" ";fi
if [ ! -z ${additional} ]; then APISTRING+="--data-urlencode \"additional_info="${additional}"\" ";fi
したがって、picture と additional が空でない場合、$APISTRING は次のようになります。
--data-urlencode "picture=someinfo" --data-urlencode "additional_info=additional infos here"
しかし、curlを呼び出すと
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING}"
次のようなエラーが表示されます
curl: オプション --data-urlencode "picture=someinfo" --data-urlencode "additional_info=ここに追加情報": 不明です
これをどう処理すればよいか、誰か知っていますか?
答え1
のように、変数の値に引用符を埋め込むと、APISTRING+="--data-urlencode \"picture=${picture}\" "
正しく動作しません。 を使用しようとすると$APISTRING
、bash は変数の値を展開する前に引用符を解析し、展開後に「新しい」引用符を再スキャンしません。その結果、引用符は文字列の区切り文字としてではなく、文字列の一部として扱われます。
このような場合の最善の解決策は、配列を使用してコマンド オプションを保存することです。
APISTRING=()
if [ ! -z ${picture} ]; then APISTRING+=(--data-urlencode "picture=${picture}");fi
if [ ! -z ${additional} ]; then APISTRING+=(--data-urlencode "additional_info=${additional}");fi
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING[@]}"
#!/bin/bash
配列はすべてのPOSIXシェルで使用できるわけではないので、明示的にbashを使用するスクリプト(またはのいずれかのシェバン)でのみ使用してください#!/usr/bin/env bash
。ない #!/bin/sh
)。また、構文は非常に厳密です。代入時の括弧、二重引用符、[@]
配列を展開するときには、省略しないでください。
ところで、別の解決策もあります。事前にオプションを蓄積するのではなく、条件付き拡張その場でそれらを含めるには:
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
${picture:+ --data-urlencode "picture=${picture}"} \
${additional:+ --data-urlencode "additional_info=${additional}"}
ここで、:+
展開により、bash は変数が空白でないかどうかをチェックし、空白でない場合にはその変数を使用せず、適切なプレフィックスが付いた変数の引用符付きバージョンである代替値を使用するように指示されます。
答え2
「${APISTRING}」に不要な引用符があります:
修理:
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" ${APISTRING}