系统
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 正常工作所必需的。