構成ファイルの生成

構成ファイルの生成

構成ファイルを生成するためのBashスクリプトを生成したいと思います。構成ファイルにパラメーターを設定する他のスクリプトによってこのファイルが呼び出されることを望みます。 (関連していない追加情報については、Bashスクリプトが設定ファイルを読み取るMatlabプログラムも実行していることに注意してください。)

たとえば、構成ファイルを生成したいとします。

変数1 = 52

変数 2 = 77.

実際には、これらの設定ファイルを生成してMainScriptを呼び出す他のスクリプト「CallScript」によって設定された変数を持つ「MainScript」というスクリプトが必要です。これをどのように実装しますか?

ベストアンサー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 以上である必要があります。

おすすめ記事