Jak mogę zaimportować dane wyjściowe z polecenia jako polecenia w Bash?

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

Kwestia

Potrzebuję uzyskać dane wyjściowe jako polecenia, w skrypcie bash, do przechowywania zmiennych.

Przykład

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

To polecenie zwraca następujące wiersze:

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

Jak mogę odczytać / uruchomić te dane wyjściowe / wiersze jako polecenia w skrypcie? Czy zapisanie tego wyniku w pliku, a następnie odczytanie go sourcewyłącznie za pomocą polecenia?

Próbowałem | sourcena końcu polecenia, ale czyta tylko z plików.

Próbowałem echona początku, ale to nie przyniosło efektu.

Dzięki.

płeć
źródło

Odpowiedzi:

15

Jak pokazał ci pLumo , możesz naprawdę source. Odradzałbym to jednak. Jeśli masz coś takiego:

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

echo "$email_sender"

Rok później, kiedy wrócisz i spojrzysz na ten skrypt, nie będziesz miał pojęcia, skąd email_senderpochodzi ta zmienna. Sugeruję zamiast tego zmienić komendę i użyć takiej, która zwraca tylko wartość zmiennej, a nie jej nazwę. W ten sposób możesz łatwo śledzić, skąd pochodzi każda zmienna:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)
terdon
źródło
Zgadzam się, że tak jest lepiej ;-) Przynajmniej w przypadku skryptów, których zamierzasz użyć później.
pLumo,
Dzięki obu! Ładne i proste. ;)
genderbee
Dla dwóch jest to w porządku, więcej używam dla pętli z pośrednią: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneNie spełnia to jednak „prostych” kryteriów.
Prawo 29
3

Możesz użyć podstawienia procesu :

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

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

lub

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

Wynik:

[email protected] [email protected]

bac0n
źródło
-1

bash read wbudowany ładnie radzi sobie z takimi rzeczami.

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

readodczytuje wiersze ze standardowego wejścia do zmiennych. -d ''wyłącza podział białych znaków, z wyjątkiem znaków nowej linii. -rwyłącza \ucieczki.

cmdA < <(cmdB)działa podobnie do cmdB | cmdA, z wyjątkiem poprzedniej, cmdA jest uruchamiany w ~ tej ~ powłoce, zamiast podpowłoki, która jest wymagana, aby odczyt działał zgodnie z oczekiwaniami.

Evan Benn
źródło
1
Czy możesz wyjaśnić różne części linii?
Simon Sudler
To prawda, ale w jaki sposób ma to związek z pytaniem, gdzie celem jest odczytanie pliku var=value?
terdon