解析配置文件并将参数传递给另一个脚本

解析配置文件并将参数传递给另一个脚本

我有一个包含以下内容的配置文件:

variable1 = 25
variable2 = 36

我想在 Bash 脚本中解析此文件,并在脚本中将每个相应的变量设置为其正确的值。我该怎么做呢?我的代码位于底部,但所做的只是显示内容。我想在脚本中实际设置变量及其值,然后检查某个变量是否满足条件,例如(伪代码):

如果“variable1 = 25”,则回显“确认”

IFS="="
while read -r name value
do
echo "Content of $name is ${value//\"/}"
done < filename

答案1

一种选择是修复文件中的语法并让 shell直接解析文件。缺点是 shell 必须能够解析有效的语法,并且您实际上是将配置文件作为运行脚本内容中的代码来运行。

幸运的是,您已经标记了bash,这很好,因为该 shell 支持关联数组。这允许您读入这些值,而无需 shell 尝试解析或评估它们,这反过来意味着您不需要太信任配置文件的内容。

假设配置设置是每行一个,您可以使用如下代码读取它们

#!/bin/bash
#
declare -A config
while IFS=$'[ \t]*=[ \t]*' read -r name value
do
    echo "Read name=$name, value=$value" >&2
    config[$name]="$value"
done

您可以使用"${config[$name]}"这样的引用来引用它们

echo "variable1=${config[variable1]}, variable2=${config[variable2]}." >&2

IFS=$'[ \t]*=[ \t]*'结构告诉read动词忽略=符号周围的空格,因此fruit=pearfruit = pear是等价的。

答案2

我建议采用不同的方法。您的变量文件与 shell 语法中的赋值语句非常相似。唯一的问题是赋值运算符周围的空格(您可以找到更多详细信息)这里)。首先,您可以使用sed如下命令来修复空格:

$ cat vars.txt
variable1 = 25
variable2 = 36

$ sed -i 's/ = /=/' vars.txt

$ cat vars.txt
variable1=25
variable2=36

完成此操作后,只需source根据需要设置所有变量的文件:

#!/bin/bash
source vars.txt
echo "Variable 1: $variable1, Variable 2: $variable2"

这会给你输出:

Variable 1: 25, Variable 2: 36

正如 roaima 在评论中指出的那样,这种方法存在安全问题。当您source创建文件时,您实际上是将其作为 shell 脚本运行(解释了执行脚本与获取脚本这里)。这意味着您必须信任该文件的内容。如果恶意用户或进程能够编辑该文件,您最终可能会执行任意命令。

另外,正如 roaima 所指出的,如果变量的值包含特殊字符,则需要引用。这个答案是专门针对问题中的数据集编写的,该数据集只有变量的数值。它不能轻易地扩展到其他类型的值。

相关内容