Puncte:7

Variabila Bash în 2 ghilimele

drapel pl

Vreau să trimit o astfel de cerere cu răsuci:

curlează niște parametri și anteturi --data-binary '{"secret":"$1"}'

dar $1 nu este variabil. Am incercat sa folosesc ecou cu aceasta comanda:

echo '{"asd":"$1"}' dhkdgb

si am obtinut aceasta iesire:

{"asd":"$1"} dhkdgb

Cu toate acestea, vreau să obțin această ieșire:

{"asd":"dhkdgb"}

Și la răsuci cerere, vreau sa trimit aceasta:

curlează niște parametri și anteturi --data-binary '{"secret":"argv 0 of script"}'

Cum pot rezolva această problemă?

drapel ar
$1 este o variabilă care conține primul argument pentru scriptul tău... dar nu folosești un script, nu? Doar tastați comanda curl la prompt? Deci $1 este gol/nesetat. De asemenea, variabilele din ghilimele simple nu sunt interpretate. Ați folosi ghilimele simple dacă doriți să folosiți „$1” literal, fără ca Bash să-l interpreteze ca o variabilă.
drapel ar
Dacă apelați acest lucru dintr-un script și `$1` este într-adevăr definit, atunci înlocuiți ghilimele simple cu ghilimele duble și ghilimelele duble fie cu ghilimele simple, fie cu ghilimele duble. Înlocuiți `'{"secret":"$1"}'` cu `"{\"secret\":\"$1\"}"` sau cu `"{'secret':'$1'}"`
drapel in
@mivk Specificația oficială JSON necesită de fapt ghilimele duble pentru șiruri (atât în ​​chei, cât și în valori), așa că pentru ca acesta să fie portabil în mod corespunzător, ar trebui să utilizați ghilimele duble în loc de abordarea ghilimelelor simple.
Puncte:11
drapel hr

Există mai multe moduri de a face acest lucru, ex. dat

$ set -- „foo bar”

(pentru a atribui valoare foo bar la primul parametru pozițional al shell-ului, ca și cum ar fi într-un script invocat ca myscript "foo bar") atunci de exemplu

$ echo '{"asd:":"'"$1"'"}'
{"asd:":"foo bar"}

sau

$ echo {\"asd:\":\""$1"\"}
{"asd:":"foo bar"}

Cu toate acestea, s-ar putea să găsești mai curat să folosești carcasa printf încorporat pentru a crea un șir formatat pe care îl puteți atribui unei variabile noi:

$ printf -v date '{"asd": "%s"}' "$1"
$ echo „$date”
{"asd": "foo bar"}

pe care apoi îl puteți folosi ca

curlează niște parametri și anteturi --data-binary "$data"

Alternativ, deoarece pare că încercați să treceți un obiect JSON la comanda curl, ați putea lua în considerare utilizarea jq in locul printf:

$ jq -nc --arg x "$1" '{asd: $x}'
{"asd":"foo bar"}

sau în mod similar folosind încorporat $ARGS matrice

$ jq -nc --arg asd "$1" '$ARGS.named'
{"asd":"foo bar"}

dacă doriți să transmiteți atât numele, cât și valoarea constructorului.

muru avatar
drapel us
`jq` are un mod mai frumos de a face asta: `jq -n --arg asd "$1" '.$ARGS.named'`
vanadium avatar
drapel cn
Dacă nu am omis ceva, cred că este mult mai ușor de rezolvat - vezi răspunsul meu.
drapel hr
@vanadium - sigur, așa cum am menționat, există mai multe moduri de a face acest lucru cu esacpes. Pur și simplu nu sunt un fan al „scobitorilor înclinați”, așa că am încercat să ofer câteva alternative
drapel hr
@muru asta e frumos - multumesc. Adăugat.
Puncte:0
drapel in

Tind să folosesc a heredoc și -d@- (citește datele de intrare din stdin) pentru alcătuirea corpurilor de solicitare JSON:

pisica <<EOF |
{
    "secret": "$SECRET"
}
EOF
curl... \
    -X POST\
    -H „Tip de conținut: aplicație/json” \
    „${BASE_URL%%/}/the/path” -d@-

Da, sintaxa este puțin ciudată.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.