使用字数统计和 awk 检查 Bash 脚本错误

使用字数统计和 awk 检查 Bash 脚本错误

我的脚本需要一点亮光,我正在对一个变量进行字数统计,得到一个 0 或更大的值,但似乎脚本在这个变量函数上中断了 计数检查=wc -l $TABLE_CHECKS | awk '{print $1}' 或者如果[$count_check-eq 0] 请参阅下面的代码。

#!/bin/bash -x
set -e
set -u


#
# Routine to check integrity of the restored backup
#


TABLE_CHECKS="$(mktemp -p .)"

mysqlcheck -e -c --all-databases | grep -e error -e Error > $TABLE_CHECKS 

        # if [ $? -eq 0 ]
            # then
              # echo "mysqlcheck running ..."
            # else
              # echo "mysqlcheck error !"
              # exit 1
        # fi

count_check=`wc -l $TABLE_CHECKS | awk '{print $1}'` 
        if [ $count_check -eq 0 ]
            then
              echo "Tables ok..."
            else
              echo "Error on one or more tables. Check  output file: table_checks.txt"
              cat $TABLE_CHECKS > table_checks-`date +%Y-%m-%d_%Hh%Mm%Ss`.txt
              rm -f $TABLE_CHECKS
              exit 1
        fi

rm -f $TABLE_CHECKS

exit 0


I've tried changing the comparison instead of using -eq I was using = , == .

需要一些专家的帮助,因为这花费的时间比需要的要多。此外,由于我的脚本编写能力有限,也欢迎使用其他方法来实现这一目标。

提前致谢 !

答案1

终止您的awk语句并在使用 bash 时始终使用适当的引用。

最后,“[”test与 Bourne Shell 相同;在编写 Bourne-Again Shell ( ) 脚本sh时使用“[[” 。bash

Grep 表达式在所有系统上的工作方式可能不同。我已尝试让您的表达式更加通用。

#!/bin/bash -x

# don't set flags unless you know you need 'em. 

#
# Routine to check integrity of the restored backup
#

TABLE_CHECKS="table_checks-`date +%Y-%m-%d_%Hh%Mm%Ss`.txt"
mysqlcheck -e -c --all-databases > $TABLE_CHECKS

# grep can do the work you want in one step.
count_check="$(grep -c -E '(error|Error)' $TABLE_CHECKS)"

# What did you get?
echo "count_check is: \"${count_check}\""

# unnecessary indenting makes this hard to read
if [[ $count_check -eq 0 ]]
then
    echo "Tables ok..."
    rm $TABLE_CHECKS
    exit 0
else
    echo "Error on one or more tables. Check output file: ${TABLE_CHECKS}"
    exit 1
fi

答案2

您已经发现您的问题是set -e和之间的交互grep不匹配任何内容。您可以添加|| true以避免这种情况,但请参见下文。

您不需要计算文件中的行数,只需测试文件中是否有任何内容即可:

if [ -s "TABLE_CHECKS" ] ; then
    NEW_TABLE_CHECKS=table_checks-`date +%Y-%m-%d_%Hh%Mm%Ss`.txt
    echo "Error on one or more tables. Check  output file: $NEW_TABLE_CHECKS"
    mv $TABLE_CHECKS $NEW_TABLE_CHECKS
    exit 1
fi

更好的是,通过将grep/set -e行为放入:来避免该行为if

if mysqlcheck -e -c --all-databases | grep -E '(error|Error)' > $TABLE_CHECKS ; then
    NEW_TABLE_CHECKS=table_checks-`date +%Y-%m-%d_%Hh%Mm%Ss`.txt
    mv $TABLE_CHECKS $NEW_TABLE_CHECKS
    echo "Error on one or more tables. Check output file: $NEW_TABLE_CHECKS. Contents of file follow:"
    cat $NEW_TABLE_CHECKS
    exit 1
fi

相关内容