Система
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
в начале, но безрезультатно.
Спасибо.
Поскольку 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)
Можно использовать замену процесса:
source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')
#!/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
колотите читает встроенные вещи дескрипторов как это приятно.
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
отключает \
Escape.
cmdA < <(cmdB)
работы так же к cmdB | cmdA, кроме бывшего cmdA выполняется в ~this ~ оболочка, вместо подоболочки, которая требуется, чтобы чтение работало как ожидалось.