Параметр -f для umount всегда будет пытаться принудительно размонтировать.
(однако это, скорее всего, будет иметь очень непредвиденные побочные эффекты.)
Я бы не рекомендовал использовать этот метод, а также рекомендовал бы вам запустить sync перед запуском umount -f , если вам нравится играть грубо.
Описываемое вами поведение списка каталогов, скорее всего, является побочным эффектом некоторого поведения кэширования в вашей программе оболочки.
Не знаю, нужен ли именно "CallScript", который вызывает "MainScript", но вот скрипт, который может делать то, что требуется (скажем, это будет "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 $@
Вот "CallScript":
$ cat CallScript.sh
bash MainScript.sh 1 11 27 23 44
Теперь измените разрешения «CallScript.sh»:
$ chmod +x CallScript.sh
А запустить можно так:
$./CallScript.sh
для создания такого файла конфигурации:
$ cat matlab.cfg Variable1 = 1 Variable2 = 11 Variable3 = 27 Variable4 = 23 Variable5 = 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
будет производить
$ cat matlab.cfg CustomVariable1 = 1 CustomVariable2 = 11 VeryCustomVariable11 = 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"
И результаты будут:
$ cat matlab.cfg CustomVar = 1230 Var1 = 5613 Var2 = MatLab Rabbit Var3 = 1328
Хотя не забудьте проверить версию bash:
$ bash --version
Должна быть версия не ниже 4, чтобы иметь ассоциативные массивы