BASH - чтение в файле конфигурации с несколькими экземплярами одной и той же «переменной» - PullRequest
3 голосов
/ 05 августа 2010

Я пытаюсь прочитать конфигурационный файл, а затем поместить «раздел» конфигов в массив в скрипте 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 ]

3 голосов
/ 05 августа 2010
#!/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гарантирует, что они не будут убиты при выходе из снаряда.Чистый эффект - превращение сценариев в демонов, чтобы они непрерывно работали в фоновом режиме независимо от того, что происходит с родительским сценарием.

2 голосов
/ 05 августа 2010
#!/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
0 голосов
/ 05 августа 2010

Предполагается, что между разделами есть только одна пустая строка:

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
...