「if」を削除してスクリプトをデバッグするにはどうすればよいですか?

「if」を削除してスクリプトをデバッグするにはどうすればよいですか?

次のコードがあります。

debug=$?
function a {
    su - javi -c "uptime"
    return $debug
}

function b {
    su - javi -c "cat /etc/redhat-release"
    return $debug
}

function c {
    su - javi -c "cat /etc/redhat-release"
    return $debug
}

case $debug in
0)
    a
    if [ $debug == 0 ]; then
        b
        echo "se ejcuta la funcion"
    elif [ $debug == 0 ]
        c   
    elif[].... <-----this

    fi
;;

1)
    echo "se ha producido un error"
;;

esac

ifを削除してデバッグする方法はありますか?私は彼らが関数を実行したいと思うし、それがうまくいったら他の関数​​にジャンプし、悪く終わったらスクリプトを残します。つまり、5つの関数があります

答え1

各機能を実行してエラーを防ぐことが目標である場合は、次のように機能します。

function bail {
    echo "se ha producido un error ($1)"
    exit 1
}

function a {
    uptime
}

function b {
    cat /etc/redhat-release
}

function c { 
    cat /etc/redhat-release
}

for f in 'a' 'b' 'c'; do
    $f || bail "$f: $?"
done

これは各関数を実行し、エラーが発生すると関数名と終了コードが関数に送信され、1行を印刷してbail別のコマンドを終了します。

suテストするのが簡単なので、使用を削除しました。これを自動化するには、sudo プロファイルを作成して高い権限でこれらのコマンドを実行することをお勧めします。これにより、パスワードを一度だけ入力したり、まったく入力する必要はありません。

答え2

  1. debug=$?すべてのコマンドで評価されるわけではありません。したがって、値はdebugスクリプト全体で同じです。
  2. 関数の戻りコードは、最後のコマンドの戻りコードです。したがって、return文は意味がありません。

要約すると、このようなタスクはa && b && c成功すると実行され、成功すると実行されます。この複合コマンドの戻りコードは、各関数のゼロ以外の最初の戻りコードです。bacb

関連情報