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

因此,如果圖片和附加內容不為空,則 $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}"

它給了一個類似的錯誤

捲曲:選項--data-urlencode「圖片= 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 shell 中都可用,因此您應該僅在明確使用 bash 的腳本中使用它(即或的 shebang #!/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}

相關內容