bash: 如何在 sed 之后从节配置文件获取数组?

bash: how to source array from section config file after sed?

我的配置文件:

[general] 

VARDIR="../var"
LOGDIR="../var/log"
HOST=$(hostname)
DAY=monday

[animals]

CATS=("cat" "food" "eur" "100" "150" ),
DOGS=("dog" "food" "usd" "5000" "8000"),

在其他 question 中我发现了这个:

sed -n '1,/animals/d;/\[/,$d;/^$/d;p;'

并且运行良好:

test@test_server$: sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config_file

CATS=("cat" "food" "eur" "100" "150" )
DOGS=("dog" "food" "usd" "5000" "8000")

但我无法在我的 shell 脚本中找到一个部分:

#!/bin/bash
source  $(sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config) 
echo $DOGS

给我

错误: ./testit.sh: 第 3 行: CATS=("cat": 没有那个文件或目录

谢谢

source 将文件作为参数。表达式:

$(sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config)

不是文件。

您可以将其重写为(注意使用 -i 对文件进行就地修改):

sed -i -n '1,/animals/d;/\[/,$d;/^$/d;p;' config
source config

source 需要一个文件作为参数。因此,替换:

source  $(sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config) 

与:

source  <(sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config) 

bash 构造 <(...) 称为 进程替换 。它创建一个 source 可以读取的类文件对象。它与称为 命令替换 $(...) 形成对比,它创建一个字符串。

我们应该用eval来执行sed命令的结果,别忘了双引号。

#!/bin/bash
eval "$(sed -n '1,/animals/d;/\[/,$d;/^$/d;p;' config)"
echo $DOGS
echo "${DOGS[2]}"

顺便说一句,应该删除配置文件中的最后一个逗号。