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,...
模式的行。
现状
我有一个外部属性文件,其中存储了几个变量。其中之一有一个值列表(最小 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,...
模式的行。