ฉันจะนำเข้าผลลัพธ์จากคำสั่งเป็นคำสั่งใน Bash ได้อย่างไร


8

ระบบ

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

ปัญหา

ฉันต้องการเอาท์พุทเป็นคำสั่งในสคริปต์ bash เพื่อเก็บตัวแปร

ตัวอย่าง

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

คำสั่งนี้ส่งคืนบรรทัดเหล่านี้:

email_sender='some@email.com'
email_recipients='another@email.com'

ฉันจะอ่าน / เรียกใช้เอาต์พุต / บรรทัดเหล่านี้เป็นคำสั่งในสคริปต์ได้อย่างไร การเก็บเอาต์พุตนี้ไปยังไฟล์จากนั้นอ่านโดยใช้sourceคำสั่งวิธีเดียว?

ฉันพยายาม| sourceที่ส่วนท้ายของคำสั่ง แต่อ่านได้จากไฟล์เท่านั้น

ฉันลองechoตอนต้น แต่ก็ไม่มีผล

ขอบคุณ

คำตอบ:


15

ในฐานะที่เป็นpLumo แสดงให้คุณเห็นคุณสามารถsourceพวกเขาแน่นอน อย่างไรก็ตามฉันอยากจะแนะนำเรื่องนี้ หากคุณมีสิ่งนี้:

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

echo "$email_sender"

จากนั้นอีกหนึ่งปีต่อมาเมื่อคุณกลับมาดูสคริปต์นี้คุณจะไม่รู้เลยว่าemail_senderตัวแปรนี้มาจากไหน ฉันขอแนะนำให้คุณเปลี่ยนคำสั่งและใช้คำสั่งที่คืนค่าของตัวแปรไม่ใช่ชื่อ ด้วยวิธีนี้คุณสามารถติดตามว่าแต่ละตัวแปรมาจากไหน:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)

ฉันเห็นด้วยกับสิ่งนี้ดีกว่า ;-) อย่างน้อยสคริปต์ที่คุณตั้งใจจะใช้ในภายหลัง
pLumo

ขอบคุณทั้งคู่! ดีและเรียบง่าย ;)
genderbee

สำหรับสองอันนี้ก็โอเคฉันใช้มากกว่าสำหรับลูปที่มีการอ้อม: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneอย่างไรก็ตามสิ่งนี้ไม่ผ่านเกณฑ์ "ง่าย"
กฎหมายที่ 29


0
#!/bin/bash

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

หรือ

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

เอาท์พุท:

some@email.com another@email.com


-1

bash read builtin จัดการสิ่งต่าง ๆ เช่นนี้

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

readอ่านบรรทัดจาก stdin ไปเป็นตัวแปร -d ''ปิดช่องว่างแยกยกเว้นการขึ้นบรรทัดใหม่ -rปิดใช้งานการ\หลบหนี

cmdA < <(cmdB)ทำงานคล้ายกับ cmdB | cmdA ยกเว้นใน cmdA เดิมนั้นทำงานใน ~ this ~ shell แทนที่จะเป็น subshell ซึ่งจำเป็นสำหรับการอ่านเพื่อทำงานตามที่คาดไว้


1
คุณช่วยอธิบายเกี่ยวกับส่วนต่าง ๆ ของบรรทัดได้ไหม?
Simon Sudler

สิ่งนี้เป็นจริง แต่มีความเกี่ยวข้องกับคำถามที่ถามว่ามีวัตถุประสงค์เพื่ออ่านจากไฟล์ด้วยได้var=valueอย่างไร
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.