함수에서 Shellscript의 호출 프로시저로 변수 값을 전달하는 방법

함수에서 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

내가 직면한 문제는 func1 내부의 $l_var 값이 C로 인쇄되지만 while 조건과 if 조건 내부에서는 null(null 값 - 함수 외부)로 인쇄된다는 것입니다.

답변1

조건부 명령이 올바르지 않습니다. [단순한 구문이 아니라 실제로주문하다. 모든 명령과 마찬가지로 인수와 구분하려면 공백이 필요합니다.

아니요

if [$l_var = "C"]

하지만

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

왼쪽의 변수 주위에 추가된 따옴표를 확인하세요. 매우 중요.


문제는 서브쉘에서 전역 변수를 설정하려고 한다는 것입니다. 이렇게 할 수 없습니다. 하위 쉘(백그라운드에서 이 함수를 실행하여 생성됨)은 상위 쉘의 환경을 변경할 수 없습니다.

가장 간단한 기술은 새 값을 파일에 쓰는 것입니다. 백그라운드 프로세스가 완료되면( 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

산출

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

답변2

ksh coprocess가 유용합니다.

#!/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

관련 정보