Мне нужен свет в моем скрипте Я подсчитываю количество слов для переменной, получающей значение 0 или больше, но похоже, что скрипт ломается в этой функции переменной count_check =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 = , == .
Нужна помощь экспертов, поскольку это занимает больше времени, чем нужно. Также приветствуются другие способы достижения этой цели, поскольку я ограничен в написании сценариев.
Заранее спасибо !
Вы уже выяснили, что ваша проблема - взаимодействие между 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
Прекратите ваш awk
оператор и всегда используйте правильные кавычки при использовании bash.
Наконец, "[" как test
для Bourne Shell sh
; используйте "[[" при написании Bourne-Again Shell (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