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

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

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

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

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

 # 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 d перед config.cfg функции и $database_username является одним из необязательных параметров.

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

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

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

2 Solutions collect form web for “Функция Bash присваивает значение переданному параметру”

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

 foo database_user tom bar 

Значением obvius, которое мы хотим, является значение database_user .

В сценарии вы можете просто поставить строку следующим образом:

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

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

 echo $dbUser tom 

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

 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 я смог показать приглашение на консоли и все еще иметь возможность возвращать строку из этой функции, используя регулярное echo . Таким образом, вызывая функцию с помощью database_username=$(getParameter ...) я могу назначить ее переменной.

  • сценарий оболочки, чтобы присоединиться к 2 файлам на основе 2 столбцов, и если совпадение найдено, напишите несколько полей
  • Как узнать, как зарегистрировать полное имя скрипта, выполненное пользователем?
  • Как написать сценарий оболочки, который запускается при входе в систему?
  • Unix Shell: назначение массива не работает
  • Добавление столбца значений в файле с разделителями табуляции
  • Использование cut / awk / sed с двумя разными разделителями
  • Обновление переменной среды в сценарии оболочки
  • Добавление метки времени в файл журнала?
  • Неизвестный синтаксис в /etc/rc.d/init.d/functions
  • объединение имен файлов в переменную
  • Замените все вхождения строки, найденной в файле, используя значения из другого файла
  • Linux и Unix - лучшая ОС в мире.