Bagaimana saya bisa mengimpor output dari perintah sebagai perintah di Bash?

8

Sistem

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Isu

Saya perlu mendapatkan output sebagai perintah, dalam skrip bash, untuk menyimpan variabel.

Contoh

sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d'

Perintah ini mengembalikan baris-baris ini:

email_sender='[email protected]'
email_recipients='[email protected]'

Bagaimana saya bisa membaca / menjalankan output / baris ini sebagai perintah dalam skrip? Apakah menyimpan hasil ini ke file dan kemudian membacanya dengan sourcecara hanya perintah?

Saya mencoba | sourcedi akhir perintah, tetapi hanya membaca dari file.

Saya mencoba echopada awalnya, tetapi itu tidak berpengaruh.

Terima kasih.

jendral
sumber

Jawaban:

15

Seperti yang ditunjukkan pLumo kepada Anda , Anda memang bisa sourcemelakukannya. Namun, saya akan merekomendasikan hal ini. Jika Anda memiliki sesuatu seperti ini:

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')

echo "$email_sender"

Kemudian, setahun kemudian ketika Anda kembali dan melihat skrip ini, Anda tidak akan tahu dari mana email_sendervariabel ini berasal. Saya menyarankan Anda sebagai gantinya mengubah perintah dan menggunakan yang hanya mengembalikan nilai variabel dan bukan namanya. Dengan begitu, Anda dapat dengan mudah melacak dari mana masing-masing variabel berasal:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)
terdon
sumber
Saya setuju ini lebih baik ;-) Setidaknya untuk skrip yang akan Anda gunakan nanti.
pLumo
Terima kasih untuk keduanya! Bagus dan sederhana. ;)
genderbee
Untuk dua ini OK, untuk lebih saya gunakan untuk loop dengan tipuan: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneNamun ini gagal kriteria "sederhana".
Law29
3

Anda dapat menggunakan substitusi proses :

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')
pLumo
sumber
0
#!/bin/bash

declare -A data
while IFS='=' read -r key value; do
    data[$key]=${value//\'/}
done < <(grep -E '^([^#].+=.*)' webcheck-$category.cfg)

atau

done < <(sed -n '/# Main configuration./,/# Websites./{//!p}' webcheck-$category.cfg)
# associative array.
echo ${data[email_sender]}
echo ${data[email_recipients]}

Keluaran:

[email protected] [email protected]

bac0n
sumber
-1

bash baca builtin menangani hal-hal seperti ini dengan baik.

read -d '' -r email_sender email_recipients < <(
  grep -oP 'email_sender=\K.*' webcheck-$category.cfg; 
  grep -oP 'email_recipients=\K.*' webcheck-$category.cfg
)

readmembaca baris dari stdin menjadi variabel. -d ''mematikan pemisahan spasi, kecuali untuk baris baru. -rMenonaktifkan \lolos.

cmdA < <(cmdB)bekerja mirip dengan cmdB | cmdA, kecuali dalam cmdA sebelumnya dijalankan di ~ this ~ shell, alih-alih sebuah subkulit, yang diperlukan untuk membaca agar berfungsi seperti yang diharapkan.

Evan Benn
sumber
1
Bisakah Anda memberikan penjelasan tentang bagian-bagian berbeda dari garis?
Simon Sudler
Ini benar, tetapi bagaimana itu relevan dengan pertanyaan yang diajukan di mana tujuannya adalah untuk membaca dari file dengan var=value?
terdon