Unixのif文に関する問題

Unixのif文に関する問題

最初のスクリプトの出力を取得していますが、次のifスクリプトではステートメントの2番目の部分の出力を取得できません。if

#!/bin/ksh

err_abc=`grep -r "XYZ" /home |wc -l`
err_AB=`grep -r "XYZ" /home` > /dev/null 2>&1
err_ERR=`grep -r "ERROR" /home |wc -l`
err_eRR=`grep -r "ERROR" /home` > /dev/null 2>&1

if [ $err_abc -gt 0 ]
then
    echo "$err_AB"
else
    echo "No errors found"

    if [ $err_ERR -gt 0 ]
    then
        echo "$err_eRR"
    else
        echo " \n No err files found"
        exit 0
    fi
fi

答え1

コードがあなたが思うように動作していると確信していますか?ロジックを見やすくするためにインデントしましょう。

if [ $err_abc -gt 0 ]; then
    echo "$err_AB"
else
    echo "No errors found"
    if [ $err_ERR -gt 0 ]; then
        echo "$err_eRR"
    else
        echo " \n No err files found"
        exit 0
    fi
fi

2番目のブロックは、最初のブロックのテストがfalseの場合にのみif実行されます。すべてのケースで両方のテストを実行するには、次のものを再構築する必要があります。

if [ $err_abc -gt 0 ]; then
    echo "$err_AB"
else
    echo "No errors found"
fi
if [ $err_ERR -gt 0 ]; then
    echo "$err_eRR"
else
    echo " \n No err files found"
    exit 0
fi

exit 0また、最後のステートメント句は、2番目のテストが偽の場合にのみ実行されますif(存在する場合)。elseこれがあなたの意図ではない場合、声明は適切に動かされるべきです。

答え2

変数を設定するには、多くの追加操作を実行する必要があります。再帰的に4回grepを実行します。一度だけ実行してください。

all_errs=$(grep -r -E "XYZ|ERROR" /home 2>/dev/null)

その後、この変数から追加情報を取得できます。

err_AB=$(grep "XYZ" <<< "$all_errs)
err_abc=$(wc -l <<< "$err_AB")

err_eRR=$(grep "ERROR" <<< "$all_errs")
err_ERR=$(wc -l <<<"$err_eRR")

関連情報