첫 번째 스크립트의 출력을 얻고 있지만 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")