Доступ к переменным по разделам из файла конфигурации

Unix System V с 1983 года. Существует довольно большая вероятность, что образ диска, который у вас есть, даже не для архитектур Intel x86 и не будет работать вообще в вашей системе или эмуляторе не говоря уже о несовместимости других драйверов оборудования. Возможно, если бы вы использовали одну из альтернативных архитектур qemu. Но, скорее всего, вам понадобится совместимое оборудование, которое все еще работает. Есть несколько видеороликов на YouTube, где люди загружают эти старые системы и немного их исследуют.

2
17.05.2018, 09:53
3 ответа

Puede crear una función de shell como esta:

printSection()
{
  section="$1"
  found=false
  while read line
  do
    [[ $found == false && "$line" != "[$section]" ]] &&  continue
    [[ $found == true && "${line:0:1}" = '[' ]] && break
    found=true
    echo "$line"
  done
}

Luego puede usar printSection como un comando y pasar la sección como un parámetro como:

printSection APP2

Para obtener su parámetro, puede usar un sed mucho más simple ahora, como:

printSection APP2 | sed -n 's/^name=//p'

Esto operará en stdin y escribirá en stdout. Entonces, si su archivo de configuración de ejemplo se llamara /etc/application.conf, y quisiera almacenar el nombre de APP2 en una variable app2name, podría escribir esto:

app2name=$(printSection APP2 | sed -n 's/^name//p/' < /etc/applications.conf)

O bien, puede construir la parte del parámetro en la función y omitir sed por completo, así:

printValue()
{
  section="$1"
  param="$2"
  found=false
  while read line
  do
    [[ $found == false && "$line" != "[$section]" ]] &&  continue
    [[ $found == true && "${line:0:1}" = '[' ]] && break
    found=true
    [[ "${line%=*}" == "$param" ]] && { echo "${line#*=}"; break; }
  done
}

Entonces asignarías tu var así:

app2name=$(printValue APP2 name < /etc/applications.conf)
3
27.01.2020, 21:58

Analice su configuración en un formato inequívoco, luego léala en una matriz asociativa en una versión reciente debash:

awk '/^\[/ { app=substr($0,2,length-2) } /=/ { print app "." $0 }' file.conf

Esto encuentra todos los encabezados de sección y establece la variable awkappen el contenido de estos. Luego antepone cada línea siguiente con ese valor seguido de un punto.

Esto crearía una salida como

APP1.name=Application1
APP1.StatusScript=/home/status_APP1.sh
APP1.startScript=/home/start_APP1.sh
APP1.stopScript=/home/stop_APP1.sh
APP1.restartScript=/home/restart.APP1.sh
APP2.name=Application2
APP2.StatusScript=/home/status_APP2.sh
APP2.startScript=/home/start_APP2.sh
APP2.stopScript=/home/stop_APP2.sh
APP2.restartScript=/home/restart.APP2.sh
APP2.logdir=/log/APP2/

Si su APP2careciera de una subsección name, la línea APP2.nameno aparecería.

Luego lea esto en una matriz asociativa enbash:

declare -A conf
while IFS='=' read -r key value; do
    conf[$key]="$value"
done < <(awk '/^\[/ { app=substr($0,2,length-2) } /=/ { print app "." $0 }' file.conf)

Ahora puede consultar la variable confpara su configuración:

printf 'The stopScript for APPN is "%s"\n' "${conf[APPN.stopScript]}"

Esto devolverá

The stopScript for APPN is "/home/stop_APPN.sh"

Consultar un valor no -existente generará una cadena vacía.


El comando awktambién podría ser reemplazado por el siguiente comando sed:

sed -n \
    -e '/^\[/{s/[][]//g;h;}' \
    -e '/=/{H;g;s/\n/./;p;s/\..*//;h;}' file.conf

Ampliado y anotado:

/^\[/{          # handle section headers
    s/[][]//g;  # remove [ and ]
    h;          # put into the hold-space
}

/=/{            # handle settings
    H;          # append the line to the hold-space with newline as delimiter
    g;          # get the hold-space
    s/\n/./;    # replace the newline with a dot
    p;          # output
    s/\..*//;   # remove everything after the dot
    h;          # put back into the hold-space
}
3
27.01.2020, 21:58

Если у вас есть доступ к Git, вы можете «злоупотребить» его configфункциями для запроса файла конфигурации:

git config --file /etc/applications.cfg --get APPN.stopScript

Вы также можете перечислить все пары ключ/значение в формате section.key=value, используя аргумент --list

git config --file /etc/applications.cfg --list

Тем не менее, я не смог понять, как перечислить один раздел.

0
27.08.2020, 09:21

Теги

Похожие вопросы