bash: 从文件中的变量读取值列表

bash: reading list of values from variable in file

现状

我有一个外部属性文件,其中存储了几个变量。其中之一有一个值列表(最小 1 值,最大 X 值)。

在 shell 脚本中声明此单个列表时,它看起来像这样:

NODES=(
    "node"
    "node-2"
    "node-3"
)

我是这样从属性文件中读取值的:

# checks, if file exists and is readable
file="./properties.credo"
if [ ! -r "$file" ]
then
    echo "fatal: properties file $file not found / readable."
    exit 2
fi

# loads properties into variables 
. $file
[[ -z "$VALUEA" ]] && echo "fatal: VALUEA not specified in .credo" && exit 2
...

问题

在这样的属性中定义 NODES 值时:

NODES=node,node-2,node-3

...并阅读:

...
[[ -z "$NODES" ]] && echo "fatal: NODES not specified in .credo" && exit 2
...

...它将作为单个字符串从文件中读取node,node-2,node-3,而不是作为列表或一维数组读取。

小心!这是危险的,因为配置文件可以包含PATH=/some/path,然后脚本可以执行您无法控制的命令。

您可以使用 read -a 来填充数组。将 IFS 设置为分隔符并将从文件读取的值发送到 read 的标准输入。

#! /bin/bash
file=

IFS== read var values < "$file"
IFS=, read -a $var <<< "$values"

echo "${NODES[@]}"

对于多行配置,我尝试了以下方法:

nodes=node1,node2,node3
servers=server1,server2

并修改脚本以循环输入:

#! /bin/bash
file=

while IFS== read var values ; do
    IFS=, read -a $var <<< "$values"
done < "$file"
echo "${nodes[@]}"
echo "${servers[@]}"

您可能需要跳过不遵循 var=val1,val2,... 模式的行。