GNU/Linux >> Znalost Linux >  >> Linux

Použití proměnných prostředí v příkazu cURL - Unix

Pro méně citací čtěte místo toho ze standardního vstupu.

curl -k -X POST -H 'Content-Type: application/json' -d @- <<EOF
{ "username": "$USERNAME", "password": "$PASSWORD"}
EOF

-d @foo čte ze souboru s názvem foo . Pokud použijete - jako název souboru se čte ze standardního vstupu. Zde je standardní vstup dodáván z dokumentu here, který je považován za řetězec s dvojitými uvozovkami, aniž by byl ve skutečnosti uzavřen do dvojitých uvozovek.


curl -k -X POST -H 'Content-Type: application/json' -d '{"username":"'$USERNAME'","password":"'$PASSWORD'"}'

Zde jsou proměnné umístěny mimo "'" uvozovek a bude rozšířen o shell (stejně jako v echo $USERNAME ). Například za předpokladu, že USRNAME=xxx a PASSWORD=yyy řetězec argv[7] předán do curl je {"username":"xxx","password":"yyy"}

A ano, toto nebude fungovat, když $USERNAME nebo $PASSWORD obsahují mezery.


Jednoduché uvozovky brání nahrazování proměnné, proto používejte dvojité uvozovky. Vnitřní dvojité uvozovky pak musí být escapovány.

...  -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"

Od té doby, co byla tato odpověď napsána v roce 2015, se ukázalo, že tato technika nestačí ke správnému vytvoření JSON:

$ USERNAME=person1
$ PASSWORD="some \"gnarly 'password"
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
{"username":"person1","password":"some "gnarly 'password"}
$ echo "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}" | jq .
parse error: Invalid numeric literal at line 1, column 47

Problém s citací je jasný. Řešení (shell) nejsou

Aktuální osvědčený postup:použijte k vytvoření JSON nástroj specifický pro JSON:

  • jq

    $ jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named'
    {"username":"person1","password":"some \"gnarly 'password"}
    
  • jo

    $ jo "username=$USERNAME" "password=$PASSWORD"
    {"username":"person1","password":"some \"gnarly 'password"}
    

A s curl:

json=$( jq -n -c --arg username "$USERNAME" --arg password "$PASSWORD" '$ARGS.named' )
# or
json=$( jo "username=$USERNAME" "password=$PASSWORD" )

# then
curl ... -d "$json"

Linux
  1. Použití kláves Vi k úpravě příkazů Shell v Unixu?

  2. Náhrada příkazů pomocí „?

  3. Používání proměnných prostředí v souborech Tmux.conf?

  1. Příklady exportních příkazů pro Linux (jak nastavit proměnné prostředí)

  2. Paralelní stahování pomocí nástroje příkazového řádku Curl

  3. Jak zachovat proměnné prostředí při použití sudo

  1. Odkazování na proměnné prostředí *v* /etc/environment?

  2. Obnovte proměnné prostředí Linux nebo Unix Path pomocí rehashe

  3. Zobrazit speciální znaky v Unixu při použití příkazu 'less'