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

当且仅当第一个块的测试为假时,您的第二个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

您需要做很多额外的工作来设置变量:您要递归地 grep 4 次。您只需执行一次:

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")

相关内容