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