Получить конкретный результат из функции

Есть ли способ вернуть определенное значение в функцию эха?

return позволяет мне вернуть статус выхода для функции. Мне нужно вернуть более сложную структуру данных, такую ​​как массив или строку. Обычно мне нужно будет повторить значение, которое я хочу вернуть. Но что, если мне нужно эхо-информативные сообщения в моей функции, и мне нужно только получить последнее эхо, которое содержит результат, который мне нужен?

У меня есть этот кусок кода, который я хотел бы сделать из него, но я хотел бы сохранить информативное эхо, поскольку они полезны для указания ввода пользователя.

 modules=(module1 module2 module3) is_valid=-1 while [ $is_valid -lt 1 ] do echo "Please chose and order the available modules you need:" echo -e $(list_array_choices modules[@]) echo -n "> " read usr_input choices=("$usr_input") is_valid=$(is_list_in_range choices[@] ${#modules[@]}) [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n" done 

Я хотел бы сделать что-то вроде

 function get_usr_choices() { modules=${!1} is_valid=-1 while [ $is_valid -lt 1 ] do echo "Please chose and order the available modules you need:" echo -e $(list_array_choices modules[@]) echo -n "> " read usr_input choices=("$usr_input") is_valid=$(is_list_in_range choices[@] ${#modules[@]}) [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n" done echo ${choices[@]} # This is the result I need. } choices=$(get_usr_choices modules[@]) 

Увы, эхо полностью испортило выход, поскольку я получаю строку, содержащую все эхо, включая информационные. Есть ли способ сделать то, что я хочу, чистым способом?

2 Solutions collect form web for “Получить конкретный результат из функции”

Вы можете выводить все остальные материалы непосредственно на экран, предполагая, что вы никогда не хотите ничего с ним делать, кроме отображения.

Что-то подобное этому можно сделать

 #!/bin/bash function get_usr_choices() { #put everything you only want sending to screen in this block { echo these echo will echo go echo to echo screen }> /dev/tty #Everything after the block is sent to stdout which will be picked up by the assignment below echo result } choices=$(get_usr_choices) echo "<choices is $choices>" 

Выполнение этого возврата

 these will go to screen <choices is result> 

Переменные не являются локальными в bash по умолчанию, поэтому вы можете просто сделать:

 function get_usr_choices() { modules=${!1} is_valid=-1 while [ $is_valid -lt 1 ] do echo "Please chose and order the available modules you need:" echo -e $(list_array_choices modules[@]) echo -n "> " read usr_input choices=("$usr_input") is_valid=$(is_list_in_range choices[@] ${#modules[@]}) [ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n" done } get_usr_choices # use choices here 

Единственное, что вы получили, это не называть get_usr_choices в подоболочке с помощью $(...) или трубы, иначе вы потеряете choices .

  • Почему тире расширяется \\\\ по-разному до bash?
  • Повторяя что-то с несколькими кавычками и ключевыми символами (&, $,! И т. Д.),
  • Запустить исполняемый файл с переменной в Bash
  • Использование разделителя табуляции в срезе в Unix Shell Scripting
  • Невозможно использовать параметр echo в файле сценария оболочки
  • В чем разница между echo `date`, echo" date "и echo '' date`?
  • Выбирайте только каталоги и порядок с помощью эха
  • Есть ли разница между двойным цитированием переменной или целой строкой в ​​эхо
  • Как я могу напечатать «-n» с помощью `echo`?
  • Выделение строки без кавычек
  • trap echo делает печать не записывать в консоль при записи в файл
  • Linux и Unix - лучшая ОС в мире.