curl: bash にオプションとして文字列を追加する

curl: bash にオプションとして文字列を追加する

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}

関連情報