Функция 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 ...) я могу назначить ее переменной.

  • Использование find -exec и проблемы с перенаправлением стандартной ошибки
  • Определите количество уникальных значений, а затем количество вхождений этих значений в файл
  • Эпиляция языка сценариев
  • Прочитайте строку из файла, манипулируйте, а затем добавьте в другой файл
  • Проверка того, что десятичное число находится в диапазоне от bc
  • bash: ожидается целочисленное выражение
  • Определить динамически выделенный порт для OpenSSH RemoteForward
  • Скопируйте всю папку из источника в пункт назначения и удалите дополнительные файлы или папку из пункта назначения
  • Какова полезность команды: в сценариях оболочки, учитывая, что она явно ничего не делает?
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Вывод каждого столбца N из ввода
  • Interesting Posts

    Как найти все квадратные изображения в каталоге

    Как запустить файл .jar? Основной класс не найден

    Как правильно установить параметр команды ядра для sdboot

    Членство в группах и процессы setuid / setgid

    rsync несколько файлов из нескольких каталогов в Linux

    транспонировать наборы из трех строк в столбцы

    Низкая стоимость, 2 порта Ethernet и запуск Linux

    Скопируйте всю папку из источника в пункт назначения и удалите дополнительные файлы или папку из пункта назначения

    (ubuntu 16.04) .rules file /etc/udev/rules.d/, похоже, не выполняет работу

    Лучший каталог для общих скриптов

    Как построить nginx на Ubuntu с модулем cache_purge?

    $ {# array} vs $ {# array }

    Процесс специфический ulimit все еще низкий после изменений в мягкие и жесткие ulimits

    Терминальный автозаполнение: цикл через предложения

    Как выполнить команду при входе в систему для пользователя системы без домашней папки и личного файла .bashrc?

    Linux и Unix - лучшая ОС в мире.