Como passar o valor da variável de função para o procedimento de chamada no Shellscript [closed]

0

Eu quero executar algumas funções com base na conclusão de outras saídas de função.

Requisito:

Chame func1 e func2 simultaneamente espere até que a funct1 termine uma vez funct1 concluída, chame func3

Por favor, encontre o mesmo código.

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

O problema que estamos enfrentando é o valor $ l_var dentro da impressão func1 como C, mas na condição while e se a condição estiver imprimindo como nula (valor vazio - fora da função).

    
por Ajay Shetty 31.08.2018 / 15:29

2 respostas

0

Seus comandos condicionais estão incorretos: o [ não é mera sintaxe, na verdade é um comando . E como todo comando, precisa de um espaço para separá-lo de seus argumentos.

Não

if [$l_var = "C"]

mas

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

Observe a adição de citações ao redor da variável à esquerda. Muito importante.

O problema é que você está tentando definir uma variável global em um subshell. Você não pode fazer isso: o shell filho (criado pela execução da função em segundo plano) não pode alterar o ambiente do pai.

A técnica mais simples é escrever o novo valor em um arquivo e quando o processo em segundo plano for concluído (o comando wait ajuda aqui), você pode ler o valor do arquivo

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

saídas

start: l_var=N
func2: l_var2=C
func1 complete
after func1, l_var=C
func3: l_var3=C
    
por 31.08.2018 / 16:18
0

O coprocess ksh pode ser útil para isso

#!/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
    
por 31.08.2018 / 15:50