我想创建一个用于创建配置文件的 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 才能具有关联数组