我想將變數字串傳遞給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}