在执行的脚本内部执行awk输出

时间:2017-01-30 01:51:11

标签: bash awk associative-array

有一些类似的主题,但这略有不同。

我的数据库包含脚本和参数a的名称。当我执行:

sqlite3 log/log.db "select name, a from result" | awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}' 

我明白了:

a[inc.bash]=4.23198234894777e-06;
a[inc.c]=3.53343440279423e-10;

在我的bash脚本中,我想使用一个关联数组。

当我执行此代码时(手动编码a[inc.bash]):

declare -A a
a[inc.bash]=4.23198234894777e-06;
echo ${a[inc.bash]}

它正常工作并打印

4.23198234894777e-06

但我不知道,如何使用awk的第一个呈现命令的输出来分配在我的脚本中声明的关联数组a的键值。

我想在我的脚本中执行由awk打印的代码,但是当我使用$()``之类的内容时,它会输出如下错误:

代码:

declare -A a
$(sqlite3 log/log.db "select name, a from result" | awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}')
echo ${a[inc.bash]}

输出:

a[inc.bash]=4.23198234894777e-06; not found command

1 个答案:

答案 0 :(得分:3)

要告诉Bash将输出解释为命令,可以使用进程替换和source命令:

declare -A a
source <(sqlite3 log/log.db "select name, a from result" |
         awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}')
echo ${a[inc.bash]}

<()构造(进程替换)可以像文件一样对待,source(或等效的.)在其参数中运行命令而不创建子shell,使得在当前shell中可以访问生成的a数组。

一个简化的例子来演示,因为我没有你的数据库:

$ declare -A a
$ source <(echo 'a[inc.bash]=value')
$ echo "${a[inc.bash]}"
value

这就是说,这和使用eval一样危险:无论你的sqlite / awk脚本输出什么,它都会被执行!