구성 파일을 생성하기 위한 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 이상이어야 합니다.