有一些类似的主题,但这略有不同。
我的数据库包含脚本和参数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
答案 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脚本输出什么,它都会被执行!