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='[email protected]'
email_recipients='[email protected]'

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.

genderbee
quelle

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)
Terdon
quelle
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
3

Sie können die Prozessersetzung verwenden :

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')
pLumo
quelle
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:

[email protected] [email protected]

bac0n
quelle
-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.

Evan Benn
quelle
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