Ошибка с выражением if в Unix

Я получаю вывод первого скрипта 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 

Вы уверены, что код делает то, что вы думаете, что он делает? Давайте сделаем это так, чтобы мы могли более легко увидеть логику:

 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 , только выполняется, только если второй тест является ложным. Если это не ваше намерение, это заявление должно быть перемещено соответствующим образом.

Вы выполняете много дополнительной работы, чтобы установить переменные: вы рекурсивно grepping 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")