
構成ファイルを生成するための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 以上である必要があります。