首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash:从文件中的变量读取值列表

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

Stack Overflow用户
提问于 2022-01-03 20:37:17
回答 1查看 620关注 0票数 0

现状

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

当在shell脚本中声明这个单一列表时,如下所示:

代码语言:javascript
复制
NODES=(
    "node"
    "node-2"
    "node-3"
)

我从属性文件中读取的值如下:

代码语言:javascript
复制
# 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
...

问题

在属性中定义节点值时,如下所示:

代码语言:javascript
复制
NODES=node,node-2,node-3

..。读到这一点:

代码语言:javascript
复制
...
[[ -z "$NODES" ]] && echo "fatal: NODES not specified in .credo" && exit 2
...

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-03 20:59:36

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

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

代码语言:javascript
复制
#! /bin/bash
file=$1

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

echo "${NODES[@]}"

对于多行配置,我尝试了以下操作:

代码语言:javascript
复制
nodes=node1,node2,node3
servers=server1,server2

并修改脚本以循环输入:

代码语言:javascript
复制
#! /bin/bash
file=$1

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70571168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档