BASH - 使用相同“变量”的多个实例读入配置文件

时间:2010-08-04 22:18:22

标签: linux arrays bash configuration-files

我正在尝试读取配置文件,然后将配置的“部分”放入bash脚本中的数组中,然后运行该命令,然后再次通过配置重新执行,并继续执行这直到配置文件结束。

以下是配置文件示例:

PORT="5000"
USER="nobody"
PATH="1"
OPTIONS=""

PORT="5001"
USER="nobody"
PATH="1"
OPTIONS=""

PORT="5002"
USER="nobody"
PATH="1"
OPTIONS=""

我希望bash脚本在第一个“部分”中读取,将其带入脚本,然后运行以下命令:
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS

但是,我希望它根据配置文件中有多少“部分”来进行“部分”的每次迭代,并运行带有相应配置设置的命令并将其应用于最终命令。因此,如果要从上面读取配置文件,输出将是:

scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS

反过来看起来像这样:

scriptname -p 5000 -u nobody -P 1 -o ""
scriptname -p 5001 -u nobody -P 1 -o ""
scriptname -p 5002 -u nobody -P 1 -o ""

提前致谢。

3 个答案:

答案 0 :(得分:3)

#!/bin/bash

if [[ $# -ne 1 ]]; then
    echo "Usage: $0 script.cfg" >&2
    exit 1
fi

function runscript() {
    scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
}

while read LINE; do
    if [[ -n $LINE ]]; then
        declare "$LINE"
    else
        runscript
    fi
done < "$1"

runscript

如果要同时在后台运行脚本,请尝试以下操作:

function runscript() {
    nohup scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS &> /dev/null &
}

最后的&使它们在后台运行,而nohup确保它们在shell退出时不会被杀死。最终效果是将脚本转换为守护进程,这样无论父脚本发生了什么,它们都会在后台连续运行。

答案 1 :(得分:2)

#!/bin/bash

awk 'BEGIN{ FS="\n";RS=""}
{
  for(i=1;i<=NF;i++){
   gsub(/.[^=]*=|\042/,"",$i)
  }
  print "scriptname -p "$1" -u "$2" -P "$3" -o "$4
}' file | bash

答案 2 :(得分:0)

假设各部分之间只有一条空行:

cat <yourfile> | while read ; do
    if [ -z "$REPLY" ] ; then
        scriptname -p $PORT -u $USER -P $PATH -o "$OPTIONS" 
    else
        eval "$REPLY" # NOTE: eval is evil
    fi
done