我有一个包含以下内容的配置文件:
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=pear
和fruit = 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 所指出的,如果变量的值包含特殊字符,则需要引用。这个答案是专门针对问题中的数据集编写的,该数据集只有变量的数值。它不能轻易地扩展到其他类型的值。