他の機能の出力完了に応じて一部の機能を実行したいと思います。
必要:
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