Создание файла конфигурации

Параметр -f для umount всегда будет пытаться принудительно размонтировать.

(однако это, скорее всего, будет иметь очень непредвиденные побочные эффекты.)

Я бы не рекомендовал использовать этот метод, а также рекомендовал бы вам запустить sync перед запуском umount -f , если вам нравится играть грубо.

Описываемое вами поведение списка каталогов, скорее всего, является побочным эффектом некоторого поведения кэширования в вашей программе оболочки.

0
26.10.2018, 10:41
1 ответ

Не знаю, нужен ли именно "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, чтобы иметь ассоциативные массивы

2
28.01.2020, 04:11

Теги

Похожие вопросы