【问题标题】:bash: reading list of values from variable in file [duplicate]bash:从文件中的变量读取值列表[重复]
【发布时间】:2022-01-03 20:37:17
【问题描述】:

现状

我有一个外部属性文件,其中存储了几个变量。其中之一有一个值列表(最小 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=node,node-2,node-3

...然后阅读:

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

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

【问题讨论】:

  • 尝试删除 $NODES 周围的引号

标签: arrays bash list file-handling


【解决方案1】:

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

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

#! /bin/bash
file=$1

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

echo "${NODES[@]}"

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

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

并修改脚本以循环输入:

#! /bin/bash
file=$1

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

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

【讨论】:

  • 明白,谢谢。我已经使用了您的代码,但得到了 NODES 的空输出。仅读取 FILE 的第一行。文件中的最后一个属性是带有列表的“节点”。我必须以某种方式循环吗?
  • 是的,如果有更多的行,你需要遍历它们。
  • 你能帮我看看,那会是什么样子?请
  • 答案已更新。
  • 顺便说一句。我不明白这里的问题的适度性。只是有人提出问题的一部分,链接它并关闭它。独立于它是否回答了整个问题。这很奇怪也很烦人。 :-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2016-07-23
  • 2022-01-05
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多