Wie kann ich die Ausgabe eines Befehls als Befehl in Bash importieren?


8

System

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

Problem

Ich muss die Ausgabe als Befehle in einem Bash-Skript zum Speichern von Variablen erhalten.

Beispiel

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

Dieser Befehl gibt folgende Zeilen zurück:

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

Wie kann ich diese Ausgaben / Zeilen als Befehle im Skript lesen / ausführen? Wird diese Ausgabe in der Datei gespeichert und dann sourcenur auf Befehl gelesen ?

Ich habe es | sourceam Ende des Befehls versucht , aber es liest nur aus Dateien.

Ich habe es echoam Anfang versucht , aber das hatte keine Wirkung.

Vielen Dank.

Antworten:


15

Wie pLumo Ihnen gezeigt hat , können Sie sie tatsächlich source. Ich würde jedoch dagegen empfehlen. Wenn Sie so etwas haben:

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

echo "$email_sender"

Dann, ein Jahr später, wenn Sie zurückkommen und sich dieses Skript ansehen, haben Sie keine Ahnung, woher diese email_senderVariable kommt. Ich schlage vor, dass Sie stattdessen den Befehl ändern und einen verwenden, der nur den Wert der Variablen und nicht ihren Namen zurückgibt. Auf diese Weise können Sie leicht verfolgen, woher jede Variable stammt:

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

Ich bin damit einverstanden, dass dies besser ist ;-) Zumindest für Skripte, die Sie später verwenden möchten.
pLumo

Danke an beide! Schön und einfach. ;)
genderbee

Für zwei ist dies in Ordnung, für mehr verwende ich für Schleifen mit einer Indirektion: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneDies entspricht jedoch nicht den "einfachen" Kriterien.
Law29


0
#!/bin/bash

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

oder

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

Ausgabe:

some@email.com another@email.com


-1

Bash Read Builtin handhabt solche Dinge gut.

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

readLiest Zeilen von stdin in Variablen. -d ''Deaktiviert die Leerzeichenaufteilung mit Ausnahme von Zeilenumbrüchen. -rdeaktiviert \Fluchtwege.

cmdA < <(cmdB)funktioniert ähnlich wie cmdB | cmdA wird, außer in der vorherigen cmdA, in ~ dieser ~ Shell anstelle einer Subshell ausgeführt, die erforderlich ist, damit das Lesen wie erwartet funktioniert.


1
Können Sie die verschiedenen Teile der Linie erklären?
Simon Sudler

Dies ist wahr, aber wie ist es relevant für die Frage, wo das Ziel ist, aus einer Datei mit zu lesen var=value?
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.