2013-06-27 3 views
134

Я работаю с Баш скрипт, и я хочу, чтобы выполнить функцию для печати возвращаемого значения:Возвращаемое значение в Баш скрипт

function fun1(){ 
    return 34 
} 
function fun2(){ 
    local res=$(fun1) 
    echo $res 
} 

Когда я исполняю fun2, не печатает «34». Почему это так?

+5

'return' в вашем случае по существу тот же, что и' exit code', который варьируется от '0 до 255'. Используйте 'echo', как было предложено @septi. Коды выхода могут быть записаны с помощью '$?'. – devnull

+0

В этом случае гораздо более гибко использовать эхо в fun1. Идея unix-программирования: echo отправляет результаты на стандартный вывод, который затем может быть повторно использован другими функциями с res = $ (fun1) - или напрямую передаваться в другие функции: 'function a() {echo 34; } '' функция b() {во время чтения данных; делать echo $ data; done;} '' a | b' –

ответ

185

Хотя bash имеет оператор return, единственное, что вы можете указать с ним, это собственный статус функции exit (значение от 0 до 255, 0 означает «успех»). Так что return - это не то, что вы хотите.

Возможно, вы захотите преобразовать свой оператор return в оператор echo - таким образом, ваш выход функции можно было бы захватить с помощью скобок $(), которая, кажется, именно то, что вы хотите.

Вот пример:

function fun1(){ 
    echo 34 
} 

function fun2(){ 
    local res=$(fun1) 
    echo $res 
} 

Другой способ получить возвращаемое значение (если вы просто хотите вернуть целое число 0-255) составляет $?

function fun1(){ 
    return 34 
} 

function fun2(){ 
    fun1 
    local res=$? 
    echo $res 
} 

Также обратите внимание, что вы можете использовать возвращаемое значение, чтобы использовать булеву логику как fun1 || fun2 будет работать только fun2 если fun1 возвращает значение 0. Возвращаемое по умолчанию значение - это последний оператор, выполняемый внутри функции.

+0

Спасибо, но я хочу использовать return.How можно получить значение? в этом случае – mindia

+2

Вам нужно выполнить 'fun1', а затем возвращаемое значение сохраняется в' $? '. Хотя я бы не рекомендовал это делать ... – tamasgal

+4

'+ 1' за то, что не предлагал' $? 'Прямо. – devnull

40

$(...) захватывает текст, отправленный на стандартный вывод, командой, содержащейся внутри. return не выводится на стандартный вывод. $? содержит код результата последней команды.

fun1(){ 
    return 34 
} 

fun2(){ 
    fun1 
    local res=$? 
    echo $res 
} 
+0

и 'return' - это код' result'? – Blauhirn

+1

Да 'return' используется для установки' $? ', Что является« статусом выхода ». В приведенном выше примере 'exit1' 'fun1'' будет' 34'. Также обратите внимание, что '$ (...)' также фиксирует stderr в дополнение к stdout из указанной команды. – swoop81

13

return оператор устанавливает код завершения функции, так же, как exit будет делать для всего сценария.

Код выхода для последней команды всегда доступен в переменной $?.

function fun1(){ 
    return 34 
} 

function fun2(){ 
    local res=$(fun1) 
    echo $? # <-- Always echos 0 since the 'local' command passes. 

    res=$(fun1) 
    echo $? #<-- Outputs 34 
} 
23

Функции в 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 - это просто простой способ его предоставить.

3

Я хотел бы сделать следующее, если работает в сценарии, где определена функция:

POINTER= # used for function return values 

my_function() { 
    # do stuff 
    POINTER="my_function_return" 
} 

my_other_function() { 
    # do stuff 
    POINTER="my_other_function_return" 
} 

my_function 
RESULT="$POINTER" 

my_other_function 
RESULT="$POINTER" 

Я это нравится, Becase Затем я могу включать эхо заявления в мои функции, если я хочу

my_function() { 
    echo "-> my_function()" 
    # do stuff 
    POINTER="my_function_return" 
    echo "<- my_function. $POINTER" 
} 
-1

Git Bash на Windows, с использованием массивов для кратному Возвращаемые значения

BASH КОД:

#!/bin/bash 

##A 6-element array used for returning 
##values from functions: 
declare -a RET_ARR 
RET_ARR[0]="A" 
RET_ARR[1]="B" 
RET_ARR[2]="C" 
RET_ARR[3]="D" 
RET_ARR[4]="E" 
RET_ARR[5]="F" 


function FN_MULTIPLE_RETURN_VALUES(){ 

    ##give the positional arguments/inputs 
    ##$1 and $2 some sensible names: 
    local out_dex_1="$1" ##output index 
    local out_dex_2="$2" ##output index 

    ##Echo for debugging: 
    echo "running: FN_MULTIPLE_RETURN_VALUES" 

    ##Here: Calculate output values: 
    local op_var_1="Hello" 
    local op_var_2="World" 

    ##set the return values: 
    RET_ARR[ $out_dex_1 ]=$op_var_1 
    RET_ARR[ $out_dex_2 ]=$op_var_2 
} 


echo "FN_MULTIPLE_RETURN_VALUES EXAMPLES:" 
echo "-------------------------------------------" 
fn="FN_MULTIPLE_RETURN_VALUES" 
out_dex_a=0 
out_dex_b=1 
eval $fn $out_dex_a $out_dex_b ##<--Call function 
a=${RET_ARR[0]} && echo "RET_ARR[0]: $a " 
b=${RET_ARR[1]} && echo "RET_ARR[1]: $b " 
echo 
##----------------------------------------------## 
c="2" 
d="3" 
FN_MULTIPLE_RETURN_VALUES $c $d ##<--Call function 
c_res=${RET_ARR[2]} && echo "RET_ARR[2]: $c_res " 
d_res=${RET_ARR[3]} && echo "RET_ARR[3]: $d_res " 
echo 
##----------------------------------------------## 
FN_MULTIPLE_RETURN_VALUES 4 5 ##<---Call function 
e=${RET_ARR[4]} && echo "RET_ARR[4]: $e " 
f=${RET_ARR[5]} && echo "RET_ARR[5]: $f " 
echo 
##----------------------------------------------## 


read -p "Press Enter To Exit:" 

ЗАПЛАНИРОВАННЫЕ:

FN_MULTIPLE_RETURN_VALUES EXAMPLES: 
------------------------------------------- 
running: FN_MULTIPLE_RETURN_VALUES 
RET_ARR[0]: Hello 
RET_ARR[1]: World 

running: FN_MULTIPLE_RETURN_VALUES 
RET_ARR[2]: Hello 
RET_ARR[3]: World 

running: FN_MULTIPLE_RETURN_VALUES 
RET_ARR[4]: Hello 
RET_ARR[5]: World 

Press Enter To Exit: