Criando um arquivo de configuração

0

Eu quero criar um script Bash que crie arquivos de configuração. Eu quero que este arquivo possa ser chamado por outro script que define parâmetros no arquivo de configuração. (Para informações adicionais, mas não relacionadas, tenha em mente que o script Bash também executa um programa Matlab que lê esse arquivo de configuração).

Por exemplo, quero produzir um arquivo de configuração com:

Variável1 = 52

Variável2 = 77.

Eu quero um script, digamos "MainScript" que produz fisicamente esse arquivo de configuração, e as variáveis são definidas por outro script "CallScript" que chama o MainScript. Como faço para implementar isso?

    
por apple 26.10.2018 / 06:55

1 resposta

0

Não se sabe se "CallScript" que chama "MainScript" é necessário, mas aqui está um script, que pode fazer o que é necessário (digamos que seria "MainScript"; se quiser, você pode colocar sua chamada: bash MainScript.sh <args> - em outro arquivo, diga "CallScript").

Versão light

$ cat MainScript.sh
#!/bin/bash
CFG_FILE="matlab.cfg"

function make_config() {
     arr=("$@") 

     echo -n "" > $CFG_FILE
     for i in "${!arr[@]}"; do
         echo "Variable$((i+1)) = ${arr[i]}" >> $CFG_FILE;
     done
}

make_config $@

Aqui está o "CallScript":

$ cat CallScript.sh
bash MainScript.sh 1 11 27 23 44

Agora altere as permissões do "CallScript.sh":

$ chmod +x CallScript.sh

E você pode lançá-lo de uma maneira:

$ ./CallScript.sh

para produzir um arquivo de configuração como este:

$ cat matlab.cfg 
Variable1 = 1
Variable2 = 11
Variable3 = 27
Variable4 = 23
Variable5 = 44

Versão mais complicada

Por outro lado, se você quiser ter (predefinidos) diferentes nomes personalizados de variáveis, você pode fazer algo assim:

$ cat MainScript.sh
#!/bin/bash

CFG_FILE="matlab.cfg"
MLAB_VARS=("CustomVariable1" "CustomVariable2" "VeryCustomVariable11")

function make_config() {

    arr=("$@") 
    var_length=${#MLAB_VARS[@]}
    entered_length=$#
    [ $var_length -gt $entered_length ] && \
        echo "Please enter more than or equal $var_length number of values for setting variables" && \
        usage && exit 1
    echo -n "" > $CFG_FILE
    for i in "${!MLAB_VARS[@]}"; do
        echo "${MLAB_VARS[i]} = ${arr[i]}" >> $CFG_FILE;
    done
}

function usage() {
cat << EOF

Usage:
    MainScript.sh [value [value [value [...]]]]

        where each value will be used to set corresponding variable
EOF
}

make_config $@

então

bash MainScript.sh 1 11 27

produzirá

$ cat matlab.cfg 
CustomVariable1 = 1
CustomVariable2 = 11
VeryCustomVariable11 = 27

e

$ bash MainScript.sh 1 11
Please enter more than or equal 3 number of values for setting variables

Usage:
    MainScript.sh [value [value [value [...]]]]

        where each value will be used to set corresponding variable

Versão complexa

Se você quiser apenas passar todo o mapa de valores de variáveis dinamicamente, use a seguinte abordagem:

$ cat MainScript.sh
#!/bin/bash

CFG_FILE="matlab.cfg"


usage() {
cat << EOF

Usage:
    MainScript.sh [value [value [value [...]]]]

        where each value will be used to set corresponding variable
EOF
}


make_config() {

    arrays_str="${@}"

    array_var="${arrays_str#*#}"
    # create new associative array with varname-values pairs from string
    eval "declare -A mlab_vars=${array_var#*=}"
    array_ord="${arrays_str%#*}"
    # create new array with vars orders from string
    eval "declare -a mlab_ords=${array_ord#*=}"

    echo -n "" > $CFG_FILE
    for key in "${mlab_ords[@]}"; do
        echo "$key" = "${mlab_vars[$key]}" >> $CFG_FILE;
    done
}


declare -A var_array
declare -a var_order

for arg in "$@"
do
    case $arg in
        -*=*|--*=*)
            arg_name="${arg%=*}"
            arg_name="${arg_name#*-*}"; arg_name="${arg_name#-}" 
            var_array["${arg_name}"]="${arg#*=}"
            var_order+=( "${arg_name}" )
            shift # past argument=value
        ;;
        h|--help)
            usage
            exit 0
        ;;
        *)
            # unknown option
            shift
        ;;
    esac
done

# convert associative array to string
assoc_array_string="$(declare -p var_array)"

assoc_array_orders="$(declare -p var_order)"

make_config "$assoc_array_orders # $assoc_array_string"

Em seguida, use-o da seguinte forma:

$ bash MainScript.sh --CustomVar=1230 --Var1=5613 --Var2="MatLab Rabbit" --Var3="1328"

E os resultados serão:

$ cat matlab.cfg 
CustomVar = 1230
Var1 = 5613
Var2 = MatLab Rabbit
Var3 = 1328

Embora não se esqueça de verificar sua versão bash:

$ bash --version   

Deve ser pelo menos a versão 4 para ter matrizes associativas

    
por 26.10.2018 / 15:32

Tags