Функция Bash присваивает значение переданному параметру

Функция Bash присваивает значение переданному параметру

У меня следующая ситуация:

Я пишу скрипт, который будет считывать свои параметры либо из файла конфигурации (если он существует и параметр присутствует), либо попросит пользователя ввести указанный параметр, если он отсутствует.

Поскольку я делаю это для нескольких параметров, я подумал, что написать функцию будет оптимальным решением.

Однако, насколько я понимаю, функция возвращает значение результата, либо echoing, либо присваивая его глобальной переменной. Я хочу вывести его на экран в функции, так что придется выбрать второй вариант. Поэтому я попробовал это:

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

Я называю это так:

getParameter "Database username" "Please enter database username" $database_username

Файл config.cfgсоздается sourceдо вызова функции и $database_usernameявляется одним из необязательных параметров.

Теперь это, очевидно, не работает. Я не могу присвоить $3и, поскольку я хочу, чтобы метод был универсальным, я не могу сделать MY_VARIABLE=$parameterни того, ни другого.

Есть ли у кого-нибудь предложения, как мне достичь всего нижеперечисленного:

  1. Получить значение переменной config.cfgили прочитать его из пользовательского ввода
  2. Делайте это обобщенно, т.е. не повторяйте приведенный выше код (без функции) для каждого параметра.

решение1

Не уверен на 100%, что понимаю, но предположим, что configфайл выглядит так:

foo
database_user tom
bar

Очевидное значение, которое нам нужно, — это database_user.

В скрипте можно просто поместить такую ​​строку:

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

Тогда переменная $dbUserбудет содержать следующую информацию:

echo $dbUser 
tom

решение2

Хорошо, похоже, я решил свою проблему:

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

Используя echo -pя смог показать приглашение на консоли и по-прежнему иметь возможность возвращать строку из функции, используя regular echo. Таким образом, вызывая функцию с помощью database_username=$(getParameter ...)я могу присвоить ее переменной.

Связанный контент