Bash

在curl命令中使用變數在bash腳本中不起作用

  • November 4, 2018

我正在嘗試編寫一個 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

引用自:https://unix.stackexchange.com/questions/479728