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]}"
顺便说一句,应该删除配置文件中的最后一个逗号。
我的配置文件:
[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]}"
顺便说一句,应该删除配置文件中的最后一个逗号。