
У меня следующая ситуация:
Я пишу скрипт, который будет считывать свои параметры либо из файла конфигурации (если он существует и параметр присутствует), либо попросит пользователя ввести указанный параметр, если он отсутствует.
Поскольку я делаю это для нескольких параметров, я подумал, что написать функцию будет оптимальным решением.
Однако, насколько я понимаю, функция возвращает значение результата, либо echo
ing, либо присваивая его глобальной переменной. Я хочу вывести его на экран в функции, так что придется выбрать второй вариант. Поэтому я попробовал это:
# 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
ни того, ни другого.
Есть ли у кого-нибудь предложения, как мне достичь всего нижеперечисленного:
- Получить значение переменной
config.cfg
или прочитать его из пользовательского ввода - Делайте это обобщенно, т.е. не повторяйте приведенный выше код (без функции) для каждого параметра.
решение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 ...)
я могу присвоить ее переменной.