GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von Umgebungsvariablen im cURL-Befehl - Unix

Wenn Sie weniger zitieren möchten, lesen Sie stattdessen von der Standardeingabe.

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

-d @foo liest aus einer Datei namens foo . Wenn Sie - verwenden als Dateiname wird von der Standardeingabe gelesen. Hier wird die Standardeingabe aus einem Here-Dokument geliefert, das als Zeichenfolge in doppelten Anführungszeichen behandelt wird, ohne sie tatsächlich in doppelte Anführungszeichen zu setzen.


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

Hier werden die Variablen außerhalb von "'" platziert Anführungszeichen und werden durch die Shell erweitert (genau wie in echo $USERNAME ). Nehmen wir zum Beispiel an, dass USRNAME=xxx und PASSWORD=yyy die Zeichenfolge argv[7] wird an curl übergeben ist {"username":"xxx","password":"yyy"}

Und ja, das funktioniert nicht, wenn $USERNAME oder $PASSWORD Leerzeichen enthalten.


Einfache Anführungszeichen verhindern die Ersetzung von Variablen, verwenden Sie also doppelte Anführungszeichen. Die inneren doppelten Anführungszeichen müssen dann maskiert werden.

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

Seit diese Antwort im Jahr 2015 geschrieben wurde, ist klar geworden, dass diese Technik nicht ausreicht, um JSON richtig zu erstellen:

$ 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

Das Zitierproblem ist klar. Die (Shell-)Lösungen sind es nicht

Aktuelle Best Practice:Verwenden Sie ein JSON-spezifisches Tool, um JSON zu erstellen:

  • 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"}
    

Und mit 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. Befehlsersetzung mit „?

  2. Verwenden von Umgebungsvariablen in Tmux.conf-Dateien?

  3. Aktualisieren Sie Linux- oder Unix-Pfadumgebungsvariablen mit Rehash

  4. Variable im Befehlspfad für ExecStart im systemd-Dienst verwenden

  5. Wie setze ich die Umgebungsvariable in GDB mit dem Shell-Befehl?

Verwenden des Watch-Befehls unter Linux

mkdir-Befehl unter Linux/Unix

Grep-Befehl unter Linux/UNIX

ls-Befehl unter Linux/UNIX

cp-Befehl unter Linux/UNIX

Linux-Umgebungsvariablen