在不使用"source"的情况下读取BASH中的配置文件

Ger*_*rry 15 bash grep config eval

我正在尝试读取格式如下的配置文件:

USER = username
TARGET = arrows
Run Code Online (Sandbox Code Playgroud)

我意识到,如果我摆脱了空间,我可以简单地获取配置文件,但出于安全考虑,我试图避免这种情况.我知道有一种方法可以逐行读取配置文件.我认为这个过程是这样的:

  1. 将行读入数组
  2. 过滤掉所有以#开头的行
  3. 在数组中搜索变量名称

在那之后,我迷路了.任何和所有的帮助将不胜感激.我尝试过这样的事情没有成功:

backup2.config>cat ~/1

grep '^[^#].*' | while read one two;do
    echo $two
done
Run Code Online (Sandbox Code Playgroud)

我从我发现的论坛帖子中删除了它,但不知道如何修改它以满足我的需求,因为我是shell脚本的新手.

http://www.linuxquestions.org/questions/programming-9/bash-shell-program-read-a-configuration-file-276852/


是否可以通过循环遍历两个数组来自动分配变量?

for (( i = 0 ; i < ${#VALUE[@]} ; i++ ))
do
    "${NAME[i]}"=VALUE[i]           
done
echo $USER
Run Code Online (Sandbox Code Playgroud)

这样调用$ USER会输出"用户名"?上面的代码不起作用,但我知道解决方案与此类似.

Sie*_*geX 12

以下脚本遍历输入文件中的每一行(在我的情况下为vars)并进行模式匹配=.如果找到等号,它将使用参数扩展值中解析出变量.然后它分别将每个部分存储在它自己的数组,名称值中.

#!/bin/bash

i=0
while read line; do
  if [[ "$line" =~ ^[^#]*= ]]; then
    name[i]=${line%% =*}
    value[i]=${line#*= }
    ((i++))
  fi
done < vars

echo "total array elements: ${#name[@]}"
echo "name[0]: ${name[0]}"
echo "value[0]: ${value[0]}"
echo "name[1]: ${name[1]}"
echo "value[1]: ${value[1]}"
echo "name array: ${name[@]}"
echo "value array: ${value[@]}"
Run Code Online (Sandbox Code Playgroud)

输入

$ cat vars
sdf
USER = username
TARGET = arrows
asdf
as23
Run Code Online (Sandbox Code Playgroud)

产量

$ ./varscript
total array elements: 2
name[0]: USER
value[0]: username
name[1]: TARGET
value[1]: arrows
name array: USER TARGET
value array: username arrows
Run Code Online (Sandbox Code Playgroud)

  • @SiegeX,为了匹配配置文件中的key = value(注意'='符号之前/之后缺少空格)但是如果我们使用表达式:name [i] = $ {line %% =*} value [i] = $ {line ##*=}似乎没问题.这样不是更好吗? (2认同)

Pau*_*ce. 5

首先,USER是一个shell环境变量,所以如果你使用别的东西可能会更好.使用小写或混合大小写变量名称是避免名称冲突的一种方法.

#!/bin/bash
configfile="/path/to/file"
shopt -s extglob
while IFS='= ' read lhs rhs
do
    if [[ $lhs != *( )#* ]]
    then
        # you can test for variables to accept or other conditions here
        declare $lhs=$rhs
    fi
done < "$configfile"
Run Code Online (Sandbox Code Playgroud)

这会将文件中的变量设置为与其关联的值.

echo "Username: $USER, Target: $TARGET"
Run Code Online (Sandbox Code Playgroud)

会输出

用户名:用户名,目标:箭头

使用键和值执行此操作的另一种方法是使用关联数组:

while循环之前添加此行:

declare -A settings
Run Code Online (Sandbox Code Playgroud)

删除循环declare内的行while并将其替换为:

    settings[$lhs]=$rhs
Run Code Online (Sandbox Code Playgroud)

然后:

# set keys
user=USER
target=TARGET
# access values
echo "Username: ${settings[$user]}, Target: ${settings[$target]}"
Run Code Online (Sandbox Code Playgroud)

会输出

用户名:用户名,目标:箭头