Bash
在curl命令中使用變數在bash腳本中不起作用
我正在嘗試編寫一個 bash 腳本來更新我的儲存庫中的某些節點。我寫了下面的腳本,但是當我在裡面使用變數時它似乎不起作用
curl
。下面是程式碼。我使用""
insidecurl
語句嘗試了所有可能的組合來解析變數。但它似乎沒有更新節點。(執行腳本時我沒有收到任何錯誤)。我回應了
curl
這樣的行:echo "curl --user admin:admin "$final_add" http://localhost:4502"$a""
並將其輸出放在腳本中,然後腳本執行良好並更新了節點。
誰能給我一些關於為什麼我不能使用 curl 中的變數更新節點的指導。
下面的程式碼範例
#!/bin/bash echo "-------------------------------------------------------------------------------------------------------------------" echo "Script to set tags" echo "-------------------------------------------------------------------------------------------------------------------" if [ true ] then echo "**firing curl command for tags2**" a="/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content" i="[/content/cq:tags/sales-stage/pre-sale,/content/cq:tags/sales-stage/special-offer]" str=$i IFS=, ary=($str) for key in "${!ary[@]}"; do tags_paths+="-Ftags2=${ary[$key]} "; done final_paths=$(echo $tags_paths | sed "s|[2],]||g") final_add="-Ftags2@TypeHint=\"String[]\" ${final_paths//[[[\[\]]/}" #have tried this without quotes too --eg : (curl --user admin:admin $final_add http://localhost:4502$a) it too didnt work curl --user admin:admin "$final_add" http://localhost:4502"$a" fi
您的問題主要與
-F
字元串中的標誌有關$final_paths
。它被傳遞給curl
. 解決方案不是取消引用變數擴展以依賴 shell 正確拆分字元串。當您有一個需要作為單獨項目傳遞給程序的事物列表時,請使用數組:
#!/bin/bash url='http://localhost:4502' url+='/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content' tag_paths=( '/content/cq:tags/sales-stage/pre-sale' '/content/cq:tags/sales-stage/special-offer' ) curl_opts=( --user "admin:admin" --form "tags3@TypeHint=String[]" ) for tag_path in "${tag_paths[@]}"; do curl_opts+=( --form "tags2=$tag_path" ) done curl "${curl_opts[@]}" "$url"
在這裡,我們將要傳遞的選項放入
curl
數組中curl_opts
。我們用我們知道將永遠存在的東西來啟動這個數組,然後通過遍歷數組來添加標籤路徑選項tag_paths
。最後的雙引號擴展"${curl_opts[@]}"
將擴展到curl_opts
數組的所有元素,每個元素單獨引用。我還選擇在開始時建構完整的 URL,因為它是靜態的,並且我使用 long 選項,
curl
因為這是一個腳本,我們可以稍微冗長一些(為了便於閱讀)。這樣做,引用變得直覺,您無需費心解析逗號分隔的列表、轉義特殊字元或設置
IFS
一些非預設值。相同的腳本,但用於
/bin/sh
:#!/bin/sh url='http://localhost:4502' url="$url/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content" set -- \ '/content/cq:tags/sales-stage/pre-sale' \ '/content/cq:tags/sales-stage/special-offer' for tag_path do set -- "$@" --form "tags2=$tag_path" shift done set -- --user "admin:admin" --form "tags3@TypeHint=String[]" "$@" curl "$@" "$url"
在這裡,我們僅限於使用一個數組,
$@
. 元素在此數組中設置為set
。