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

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

系统

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

source我如何在脚本中将这些输出/行作为命令读取/运行?是否只将此输出存储到文件然后通过命令读取它?

我尝试| source在命令结束时执行此操作,但它只从文件中读取。

echo一开始也尝试过,但是没有什么效果。

谢谢。

答案1

作为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)

答案2

您可以使用流程替代

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

答案3

#!/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]}

输出:

[电子邮件保护] [电子邮件保护]

答案4

bash read 内置命令可以很好地处理这类事情。

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 在 ~this~ shell 中运行,而不是在子 shell 中运行,这是 read 正常工作所必需的。

相关内容