関数から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

おすすめ記事