Saya telah menulis skrip untuk mengambil nilai tertentu file.json
. Ini berfungsi jika saya memberikan nilai ke jq select
, tetapi variabel tampaknya tidak berfungsi (atau saya tidak tahu cara menggunakannya).
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="[email protected]") | .id')
echo "$projectID"
EMAILID=myemail@hotmail.com
#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
json
bash
environment-variables
jq
asidd
sumber
sumber
jq -r --arg var "$var" '.[$var]'
stackoverflow.com/questions/34745451/…Jawaban:
Pertimbangkan juga untuk meneruskan variabel shell (EMAILID) sebagai variabel jq (di sini juga EMAILID, sebagai ilustrasi):
Nota bene
Sebagai catatan, kemungkinan lain adalah menggunakan
env
fungsi jq untuk mengakses variabel lingkungan. Misalnya, pertimbangkan urutan perintah bash ini:Outputnya adalah string JSON:
sumber
jq
membuat filter dengan benar menggunakan nilai, daripada menggunakanbash
untuk membuat string yangjq
ditafsirkan sebagai filter. (Pertimbangkan apa yang terjadi jika nilaiEMAILID
berisi a)
.)function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }
Menelepon:n2 Name1
env
fungsi jq diubah antara jq 1.4 dan 1.5+, jadi referensi keenv.EMAILID
(dalam contoh jawaban ini) tidak berfungsi di jq 1.4, sehingga merekomendasikan penggunaan--arg EMAILID "$EMAILID"
konstruksi jika Anda perlu menggunakan jq 1.4. Semoga ini membantu; hanya butuh satu hari + untuk memikirkannya sendiri;)--arg
akan diteruskan sebagai string. Jika Anda ingin meneruskan data dari jenis JSON yang berbeda, gunakan--argjson
, yang akan mengurai string sebagai JSON, misalnya,--argjson myObj '{"a": [1, 2]}'
Saya menyelesaikan masalah ini dengan keluar dari tanda kutip ganda batin
sumber
-c
Ini masalah kutipan, Anda perlu:
Jika Anda meletakkan tanda kutip tunggal untuk membatasi string utama, shell akan memahami
$EMAILID
secara harfiah."Double quote" setiap literal yang berisi spasi / metakarakter dan setiap ekspansi:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
. Gunakan'single quotes'
untuk kode atau literal$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
. Lihathttp://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
sumber
termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'
. Hasil:jq Compile error
jq
tidak menyukai tanda kutip tunggal:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
Posting di sini karena dapat membantu orang lain. Dalam string mungkin perlu untuk meneruskan tanda kutip ke jq. Untuk melakukan hal berikut dengan jq:
dalam pesta yang bisa Anda lakukan
pada dasarnya keluar dari tanda kutip dan meneruskannya ke jq
sumber
Cara lain untuk melakukannya adalah dengan flag jq "--arg". Menggunakan contoh asli:
Lihat di sini, di mana saya menemukan solusi ini: https://github.com/stedolan/jq/issues/626
sumber
Saya tahu agak terlambat untuk membalas, maaf. Tapi itu berhasil untuk saya.
Dan sekarang saya bisa mengambil dan meneruskan konten variabel ke jq
Dalam kasus saya, saya perlu menggunakan kutipan ganda dan kutipan untuk mengakses nilai variabel.
Bersulang.
sumber
Jq sekarang memiliki cara yang lebih baik untuk mengakses variabel lingkungan, Anda dapat menggunakan env.EMAILI:
sumber
Sedikit tidak terkait tetapi saya akan tetap meletakkannya di sini, Untuk tujuan praktis lainnya variabel shell dapat digunakan sebagai -
sumber