GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan Variabel Lingkungan di Perintah cURL - Unix

Untuk mengurangi kutipan, baca dari input standar saja.

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

-d @foo membaca dari file bernama foo . Jika Anda menggunakan - sebagai nama file, itu dibaca dari input standar. Di sini, masukan standar diberikan dari dokumen di sini, yang diperlakukan sebagai string dengan tanda kutip ganda tanpa benar-benar menyertakannya dalam tanda kutip ganda.


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

Di sini variabel ditempatkan di luar "'" tanda kutip dan akan diperluas oleh shell (seperti di echo $USERNAME ). Misalnya dengan asumsi bahwa USRNAME=xxx dan PASSWORD=yyy string argv[7] diteruskan ke curl adalah {"username":"xxx","password":"yyy"}

Dan ya, ini tidak akan berfungsi jika $USERNAME atau $PASSWORD berisi karakter spasi.


Tanda kutip tunggal menghambat substitusi variabel, jadi gunakan tanda kutip ganda. Tanda kutip ganda dalam kemudian harus diloloskan.

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

Sejak jawaban ini ditulis pada tahun 2015, menjadi jelas bahwa teknik ini tidak cukup untuk membuat JSON dengan benar:

$ 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

Masalah kutipan jelas. Solusi (shell) bukan

Praktik terbaik saat ini:gunakan alat khusus JSON untuk membuat 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"}
    

Dan dengan ikal:

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. Segarkan Variabel Lingkungan Linux atau Unix Path dengan pengulangan

  2. Tampilkan karakter khusus di Unix saat menggunakan Perintah 'kurang'

  3. Unduhan paralel menggunakan utilitas baris perintah Curl

  1. Bagaimana menjaga variabel lingkungan saat menggunakan sudo

  2. Menggunakan sertifikat klien dalam perintah Curl

  3. Variabel lingkungan dari proses yang berjalan di Unix?

  1. Menggunakan Tombol Vi Untuk Mengedit Perintah Shell Di Unix?

  2. Menggunakan Variabel Lingkungan Dalam File Tmux.conf?

  3. Referensi Variabel Lingkungan *di* /etc/environment?