如何在Bash中将命令的输出作为命令导入?


8

系统

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在一开始就尝试过,但是没有效果。

谢谢。

Answers:


15

正如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)

我同意这会更好;-)至少对于您打算以后使用的脚本。
pLumo

多亏了!漂亮又简单。;)
sexbee's

对于两个来说,这是可以的,对于更多内容,我将使用带间接的循环:for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; done但是,这不符合“简单”条件。
法律

3

您可以使用流程替换

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)

要么

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


-1

bash read Builtin可以很好地处理此类问题。

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

read从标准输入读取行到变量。-d ''关闭除换行符以外的空格分割。-r禁用\转义。

cmdA < <(cmdB)的工作原理类似于cmdB | 除了在以前的cmdA中运行cmdA之外,cmdA在〜this〜外壳中运行,而不是在子外壳中运行。


1
您可以对生产线的不同部分进行一些解释吗?
西蒙·苏德勒

的确如此,但是与目标从何处读取文件的问题有var=value什么关系呢?
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.