Функции в Bash не являются функциями, как на другом языке; они на самом деле являются командами. Таким образом, функции используются так, как если бы они были двоичными файлами или сценариями, извлеченными из вашего пути. С точки зрения вашей логики программы не должно быть никакой разницы.
Команды оболочки соединены трубами (или потоками), а не фундаментальными или определяемыми пользователем типами данных, как в «реальных» языках программирования. Нет такой вещи, как возвращаемое значение для команды, возможно, главным образом потому, что нет реального способа объявить ее. Это может произойти на man-странице, или на выходе команды --help
, но оба являются только удобочитаемыми и, следовательно, записаны на ветер.
Когда команда хочет получить вход, она считывает ее из своего входного потока или списка аргументов. В обоих случаях текстовые строки должны быть проанализированы.
Когда команда хочет что-то вернуть, она должна быть равна echo
его выходному потоку. Другим часто практикуемым способом является сохранение возвращаемого значения в выделенных глобальных переменных. Запись в выходной поток является более четкой и гибкой, поскольку она может принимать двоичные данные.Например, вы можете вернуть BLOB легко:
encrypt() {
gpg -c -o- $1 # encrypt data in filename to stdout (asks for a passphrase)
}
encrypt public.dat > private.dat # write function result to file
Как уже написано в этой теме, абонент может использовать команду замены $()
, чтобы захватить выход.
Параллельно функция «вернет» код выхода gpg
(GnuPG). Подумайте о коде выхода в качестве бонуса, которого не имеют другие языки, или, в зависимости от вашего темперамента, как «Шмутцефф» функций оболочки. Этот статус, по соглашению, равен 0 по успеху или целому числу в диапазоне 1-255 для чего-то еще. Чтобы сделать это ясно: return
(например, exit
) может принимать только значение от 0 до 255, а значения, отличные от 0, не обязательно являются ошибками, как это часто утверждается.
Если вы не указали явное значение с return
, статус берется из последней команды в команде Bash/function/command и так далее. Таким образом, всегда есть статус, и return
- это просто простой способ его предоставить.
'return' в вашем случае по существу тот же, что и' exit code', который варьируется от '0 до 255'. Используйте 'echo', как было предложено @septi. Коды выхода могут быть записаны с помощью '$?'. – devnull
В этом случае гораздо более гибко использовать эхо в fun1. Идея unix-программирования: echo отправляет результаты на стандартный вывод, который затем может быть повторно использован другими функциями с res = $ (fun1) - или напрямую передаваться в другие функции: 'function a() {echo 34; } '' функция b() {во время чтения данных; делать echo $ data; done;} '' a | b' –