Làm cách nào tôi có thể nhập đầu ra từ một lệnh dưới dạng lệnh trong Bash?


8

Hệ thống

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

Vấn đề

Tôi cần nhận đầu ra dưới dạng các lệnh, trong tập lệnh bash, để lưu trữ các biến.

Thí dụ

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

Lệnh này trả về các dòng này:

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

Làm cách nào tôi có thể đọc / chạy các đầu ra / dòng này dưới dạng các lệnh trong tập lệnh? Là lưu trữ đầu ra này vào tập tin và sau đó đọc nó bằng cách sourcechỉ lệnh?

Tôi đã thử | sourceở cuối lệnh, nhưng nó chỉ đọc từ các tập tin.

Tôi đã thử echongay từ đầu, nhưng điều đó không có kết quả.

Cảm ơn.

Câu trả lời:


15

Như pLumo đã cho bạn thấy , bạn thực sự có thể sourcehọ. Tuy nhiên, tôi sẽ đề nghị chống lại điều này. Nếu bạn có một cái gì đó như thế này:

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

echo "$email_sender"

Sau đó, một năm sau khi bạn quay lại và xem kịch bản này, bạn sẽ không biết email_senderbiến này đến từ đâu. Tôi đề nghị bạn thay đổi lệnh và sử dụng một lệnh chỉ trả về giá trị của biến chứ không phải tên của nó. Bằng cách đó, bạn có thể dễ dàng theo dõi từng biến đến từ đâu:

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

Tôi đồng ý điều này là tốt hơn ;-) Ít nhất là đối với các tập lệnh bạn định sử dụng sau này.
pLumo

Cảm ơn cả hai nha! Đẹp và đơn giản. ;)
giới tính

Đối với hai điều này là OK, để biết thêm, tôi sử dụng các vòng lặp với một sự gián tiếp: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneTuy nhiên, điều này không đạt được tiêu chí "đơn giản".
Luật29

3

Bạn có thể sử dụng thay thế quá trình :

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

0
#!/bin/bash

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

hoặc là

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

Đầu ra:

some@email.com other@email.com


-1

bash đọc dựng sẵn xử lý những thứ như thế này độc đáo.

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

readđọc các dòng từ stdin thành các biến. -d ''tắt phân tách khoảng trắng, ngoại trừ dòng mới. -rvô hiệu hóa \thoát.

cmdA < <(cmdB)hoạt động tương tự cmdB | cmdA, ngoại trừ trong cmdA trước đây được chạy trong ~ this ~ shell, thay vì một subshell, được yêu cầu để đọc hoạt động như mong đợi.


1
Bạn có thể giải thích về các phần khác nhau của dòng?
Simon Sudler

Điều này là đúng, nhưng làm thế nào nó có liên quan đến câu hỏi được hỏi mục tiêu được đọc từ một tệp với mục đích var=valuegì?
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.