Unix의 if 문 관련 문제

Unix의 if 문 관련 문제

첫 번째 스크립트의 출력을 얻고 있지만 if다음 스크립트에서 문의 두 번째 부분의 출력을 얻을 수 없습니다.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

두 번째 블록은 첫 번째 블록의 테스트가 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또한 최종 문의 절은 두 번째 테스트가 거짓인 경우 에만 실행됩니다 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")

관련 정보