Saya memiliki fragmen JSON.
Berikut ini tidak berfungsi:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Hasilnya adalah:
Tidak ada objek JSON yang bisa diterjemahkan
Melakukan hal yang sama dengan jq
, yaitu
echo -n "$VALUE" | jq '.'
Tidak ada output.
Ada perilaku yang sama untuk yang berikut:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Tanggapan:
Tidak ada objek JSON yang bisa diterjemahkan
Tetapi berikut ini berfungsi:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
tanpa... | jq
akan informatif.Jawaban:
Tidak ada output.
Dokumen di sini adalah pengalihan , Anda tidak dapat mengarahkan ulang ke variabel.
Ketika baris perintah diuraikan, pengalihan ditangani dalam langkah terpisah dari penugasan variabel. Karena itu perintah Anda setara dengan (perhatikan spasi)
Yaitu, ia memberikan string kosong ke variabel Anda, kemudian mengarahkan input standar dari string-sini ke dalam perintah (tetapi tidak ada perintah, jadi tidak ada yang terjadi).
Catat itu
valid, sebagaimana adanya
Hanya saja tidak ada perintah yang aliran input standarnya dapat diatur untuk berisi data, sehingga hilang begitu saja.
Ini akan berhasil:
Di sini, perintah yang menerima dokumen-sini adalah
cat
, dan menyalinnya ke output standarnya. Inilah yang kemudian ditugaskan ke variabel melalui substitusi perintah.Dalam kasus Anda, Anda bisa menggunakan
tanpa mengambil langkah ekstra menyimpan data dalam suatu variabel.
sumber
PERSON="
diikuti oleh baris baru dan data multi-baris, lalu yang lain"
di akhir.PERSON='
. Itu kecuali OP ingin menginterpolasi variabel nanti.Karena variabel tidak disetel oleh heredoc Anda:
Jika Anda ingin menggunakan heredoc untuk memberikan nilai pada variabel, Anda perlu sesuatu seperti:
sumber
<< \PERSON
untuk melindungi terhadap$
input dan backslash di ujung baris.$(cat <<EOF ... EOF)
itu konstruk yang aneh: menjalankan subkulit dan kemudian mengirim heredoc ke kucing sehingga mengirimkannya ke STDOUT dan kemudian menetapkan hasil subkulit itu ke variabel? Saya berharap orang berpikir tentang apa yang mereka katakan tentang proses pemikiran mereka. Menetapkan heredoc ke variabel melaluiread
, sebagai perbandingan, adalah waras.$(cat << EOF
... (data) ...EOF
)
aneh. Ini canggung dan berbelit-belit, tetapi begituread -d … << EOF
- terutamaread -d '' << EOF
. Saya menghargai jawaban terdon karena hanya menggunakan builtin, tidak ada program. Tetapi, yang lebih penting,$(cat << EOF
... (data) ...EOF
)
gagal jika ada garis yang diakhiri dengan\
(garis miring terbalik) - lihat komentar di bawah jawaban Kusalananda .Itu karena cara Anda mendefinisikan dokumen di sini untuk digunakan dengan JSON salah. Anda harus menggunakannya sebagai
dan melakukan
printf "$VALUE"
harus membuang JSON seperti yang diharapkan.sumber
Variabel dan variabel Hered tidak tercampur dengan baik atau setidaknya tidak dengan cara ini. Anda bisa ...
Lulus heredoc sebagai input standar aplikasi
atau…
Menyimpan teks multi-baris dalam variabel shell
Saya menggunakan tanda kutip tunggal untuk menghindari perlunya lolos dari tanda kutip ganda batin. Tentu saja Anda juga dapat menggunakan tanda kutip ganda, misalnya jika Anda perlu memperluas parameter:
Kemudian Anda bisa menggunakan nilai variabel nanti.
sumber