當我在帶有 json 索引的curl上輸入一個變數時,它采用變數的字串值,如果我對雙引號進行了轉義,它會回傳一個 sintax 錯誤,因為在json請求中,您必須使用 double 輸入資料-引號。例子:
#!/bin/bash
token="x"
tokenPass="x"
name="prueba"
url="https://prueba.prueba.prueba"
user="prueba"
pass="prueba"
notes="prueba"
curl -k -H "Content-Type:Application/json" -d '{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "$token", "tokenPass": "$tokenPass", "name": "$name" , "categoryId": "7", "clientId": "9","login":"$user","url": "$url" ,"pass": "$pass","notes": "$notes"}, "id": 1}' -o- https://syspass.prueba.es/api.php
該卷曲JSON請求作業,如果我手動輸入的資料,但這些變數,當我創建的帳戶,該帳戶被命名為變數的字串值,我的意思是,如果變數被命名為$名,帳戶創建的名稱$name。請問有什么幫助嗎?我也嘗試輸入變數:“${variable}”并且要么有效
uj5u.com熱心網友回復:
嘗試這個:
curl -k -H "Content-Type:Application/json" -d '{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "'${token}'", "tokenPass": "'${tokenPass}'", "name": "'${name}'" , "categoryId": "7", "clientId": "9","login":"'${user}'","url": "'${url}'" ,"pass": "'${pass}'","notes": "'${notes}'"}, "id": 1}' -o- https://syspass.prueba.es/api.php
一點解釋:單引號之間的文本'不會被 bash 解釋,這就是變數不會被插入的原因。你必須把字串分開... 另一個建議是你應該在變數周圍使用花括號:我們什么時候需要在 shell 變數周圍使用花括號?
uj5u.com熱心網友回復:
我在這里解釋變數token。其他變數可以用同樣的方式處理。
假設變數token包含字串foo bar baz,那么您希望curl接收以下字串作為其第 5 個引數:
{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "foo bar baz", "tokenPass":... rest omitted for brevity}
由于這必須成為單個引數,因此您必須以某種方式參考空字串,并且由于該字串包含許多雙引號,因此使用單引號進行包裝更容易。但是,這會阻止引數擴展。為了實作這一點,變數必須在單引號之外。但是,它們也必須在雙引號內,以免在變數包含空格時成為分詞的受害者。這產生了以下解決方案:
curl .... '{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "'"$token"'", "tokenPass": ... rest omitted for brevity}'
注意"'"前面的$token: 第一個雙引號將成為擴展的一部分"foo bar baz"。它必須是字面的,因為 curl 想看到它。下一個單引號終止初始單引號。下一個雙引號告訴外殼 expand $token,但不嘗試分詞。
如果要擴展的引數很多,則生成的運算式很難除錯和維護。另一種方法是設定一個 HERE 檔案:
# Set up Parameter 5 for curl
read p5 <<END
{"jsonrpc": "2.0", "method": "account/create", "params": { "authToken": "$token", "tokenPass":... rest omitted for brevity}
END
然后將其用作
curl .... -d "$p5"
這需要設定引數的單獨步驟,但最終更具可讀性,您也不必擔心分詞。
uj5u.com熱心網友回復:
我會jq用來生成 JSON 字串(主要是為了處理參考,JSON 字串不是微不足道的),并且為了可讀性(以及為了下一個維護者的理智)添加一些換行符和縮進:
data=$(
jq -n \
--arg token "$token" \
--arg tokenPass "$tokenPass" \
--arg name "$name" \
--arg url "$url" \
--arg user "$user" \
--arg pass "$pass" \
--arg notes "$notes" \
'{
jsonrpc: "2.0",
method: "account/create",
params: {
authToken: $token,
tokenPass: $tokenPass,
name: $name,
categoryId: "7",
clientId: "9",
login: $user,
url: $url ,
pass: $pass,
notes: $notes
},
id: 1
}'
)
curl -k \
-H "Content-Type:Application/json" \
-d "$data" \
-o- \
https://syspass.prueba.es/api.php
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358767.html
上一篇:回圈一級深的目錄,并在該目錄中的bash中以目錄名稱作為引數執行腳本
下一篇:tar命令的問題
