Как передать значение переменной из функции в вызывающую процедуру в Shellscript

Я хочу выполнить несколько функций, основанных на завершении вывода других функций.

Требование:

Вызовите func1 и func2 одновременно, дождитесь завершения funct1 после завершения funct1, вызовите func3

Пожалуйста, найдите тот же код.


l_var='N'; func1() { l_var='C' # do some logic which will take time echo "$l_var" } func2() { l_var2='C' # do some logic which will take time echo "$l_var2" } func3() { l_var3='C' # do some logic which will take time echo "$l_var3" } # call function1 and function2 parallaly func1 & func2 echo "$l_var" # wait until funct1 complete while [$l_var != "C"] do sleep 30 done # once function1 one completed, then call function3 if [$l_var = "C"] then func3 fi 

Проблема, с которой я сталкиваюсь, это значение $ l_var внутри func1, печатающего как C, но в то время как условие и если условие печатает как ноль (пустое значение – вне функции).

2 Solutions collect form web for “Как передать значение переменной из функции в вызывающую процедуру в Shellscript”

Ваши условные команды неверны: [ это не просто синтаксис, это фактически команда . И, как и любая команда, ей нужно пространство, чтобы отделить ее от своих аргументов.

Не

 if [$l_var = "C"] 

но

 if [ "$l_var" = "C" ] # ..^........^.^...^ mandatory whitespace 

Обратите внимание на добавление кавычек вокруг левой переменной. Очень важно.


Проблема в том, что вы пытаетесь установить глобальную переменную в подоболочке. Вы не можете сделать это: дочерняя shell (созданная путем запуска функции в фоновом режиме) не может изменить среду родителя.

Самый простой способ – записать новое значение в файл, а когда завершенный фоновый процесс (здесь помогает команда wait ), вы можете прочитать значение из файла.

 #!/bin/bash tmpfile=$(mktemp) l_var='N'; func1() { l_var='C' # do some logic which will take time sleep 5 echo "$l_var" > "$tmpfile" echo "$FUNCNAME complete" } func2() { l_var2='C' # do some logic which will take time sleep 1 echo "$FUNCNAME: l_var2=$l_var2" } func3() { l_var3='C' # do some logic which will take time echo "$FUNCNAME: l_var3=$l_var3" } echo "start: l_var=$l_var" # call function1 and function2 parallaly func1 & func2 # wait for func1, then read the new value from the file wait l_var=$(< "$tmpfile") echo "after func1, l_var=$l_var" # once function1 one completed, then call function3 if [[ "$l_var" == "C" ]]; then func3 fi , #!/bin/bash tmpfile=$(mktemp) l_var='N'; func1() { l_var='C' # do some logic which will take time sleep 5 echo "$l_var" > "$tmpfile" echo "$FUNCNAME complete" } func2() { l_var2='C' # do some logic which will take time sleep 1 echo "$FUNCNAME: l_var2=$l_var2" } func3() { l_var3='C' # do some logic which will take time echo "$FUNCNAME: l_var3=$l_var3" } echo "start: l_var=$l_var" # call function1 and function2 parallaly func1 & func2 # wait for func1, then read the new value from the file wait l_var=$(< "$tmpfile") echo "after func1, l_var=$l_var" # once function1 one completed, then call function3 if [[ "$l_var" == "C" ]]; then func3 fi , #!/bin/bash tmpfile=$(mktemp) l_var='N'; func1() { l_var='C' # do some logic which will take time sleep 5 echo "$l_var" > "$tmpfile" echo "$FUNCNAME complete" } func2() { l_var2='C' # do some logic which will take time sleep 1 echo "$FUNCNAME: l_var2=$l_var2" } func3() { l_var3='C' # do some logic which will take time echo "$FUNCNAME: l_var3=$l_var3" } echo "start: l_var=$l_var" # call function1 and function2 parallaly func1 & func2 # wait for func1, then read the new value from the file wait l_var=$(< "$tmpfile") echo "after func1, l_var=$l_var" # once function1 one completed, then call function3 if [[ "$l_var" == "C" ]]; then func3 fi , #!/bin/bash tmpfile=$(mktemp) l_var='N'; func1() { l_var='C' # do some logic which will take time sleep 5 echo "$l_var" > "$tmpfile" echo "$FUNCNAME complete" } func2() { l_var2='C' # do some logic which will take time sleep 1 echo "$FUNCNAME: l_var2=$l_var2" } func3() { l_var3='C' # do some logic which will take time echo "$FUNCNAME: l_var3=$l_var3" } echo "start: l_var=$l_var" # call function1 and function2 parallaly func1 & func2 # wait for func1, then read the new value from the file wait l_var=$(< "$tmpfile") echo "after func1, l_var=$l_var" # once function1 one completed, then call function3 if [[ "$l_var" == "C" ]]; then func3 fi 

выходы

 start: l_var=N func2: l_var2=C func1 complete after func1, l_var=C func3: l_var3=C 

для этого может пригодиться ksh-копроцесс

 #!/usr/bin/ksh func1() { sleep $1 echo "X${1}X" } func2() { sleep $1 echo "Y${1}Y" } func3() { sleep $1 echo "Z${1}Z" } func1 10 |& exec 5>&p # assign fd 5 to stdout exec 6< &p # and fd 6 to stdin func2 7 & func3 5 |& read -u6 F1A read -p F3A echo $F1A echo $F3A echo "wait until all is done" wait 
  • Использование netcat и curl вместе в скрипте bash
  • Как напечатать количество рисунков в каждой строке?
  • Разбор числа из URL в bash и подача в другую функцию bash?
  • Перебирать переменные
  • Удаленно удалите схему Oracle с помощью сценария оболочки
  • использование sed для замены строки в файлах, которые находятся в разных папках
  • Как я могу пропустить оставшуюся часть сценария, не выходя из вызывающей оболочки, при поиске сценария?
  • grep файл журнала, начиная с определенного времени и до конца файла
  • Получить список файлов в качестве вывода скрипта?
  • Как я могу найти соответствующий шаблон (хранящийся в переменной) в файле, используя awk?
  • Использование переменной * в сценарии оболочки для ссылки на все файлы в папке
  • Linux и Unix - лучшая ОС в мире.