创建配置文件

创建配置文件

我想创建一个用于创建配置文件的 Bash 脚本。我希望这个文件能够被另一个在配置文件中设置参数的脚本调用。 (要记住其他但不相关的信息,Bash 脚本还运行一个读取该配置文件的 Matlab 程序)。

例如,我想生成一个配置文件:

变量 1 = 52

变量2 = 77。

我想要一个脚本,比如“MainScript”,它实际上生成这样一个配置文件,并且变量由另一个调用 MainScript 的脚本“CallScript”设置。我该如何实施呢?

答案1

不知道是否需要调用“MainScript”的“CallScript”,但这里有一个脚本,它可以执行所需的操作(假设它是“MainScript”;如果您愿意,您可以将其调用:bash MainScript.sh <args>— 进入另一个文件,说“CallScript”)。

轻型版

$ 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 $@

这是“调用脚本”:

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

现在更改“CallScript.sh”的权限:

$ chmod +x CallScript.sh

你可以通过这样的方式启动它:

$ ./CallScript.sh

生成这样的配置文件:

$ 猫 matlab.cfg
变量 1 = 1
变量2 = 11
变量3 = 27
变量4 = 23
变量5 = 44

更复杂的版本

另一方面,如果您想要(预定义)不同的自定义变量名称,您可以这样做:

$ 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 $@

然后

bash MainScript.sh 1 11 27

将产生

$ 猫 matlab.cfg
自定义变量1 = 1
自定义变量2 = 11
非常自定义变量11 = 27

$ 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

复杂版

如果您只想动态传递所有变量值映射,可以使用以下方法:

$ 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"

然后这样使用它:

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

结果将是:

$ 猫 matlab.cfg
自定义变量 = 1230
变量1 = 5613
Var2 = MatLab 兔
变量3 = 1328

不过,不要忘记检查您的 bash 版本:

$ bash --version   

必须至少是版本 4 才能具有关联数组

相关内容