Ошибки с shell-скриптом - PullRequest
       2

Ошибки с shell-скриптом

2 голосов
/ 12 декабря 2011

я нашел причудливую ошибку. Я хочу увеличить счетчик, но переменная не видна снаружи, пока делаю.

Сценарий выглядит следующим образом:

    ## $1 - The file which should be examined
## $2 - The time passed between the checks. If $2 is 5 then all lines from the last 5 minutes are taken
## $3 - The Errormessage to search for

outputOK="OK - nothing happened"
output_logcheck=0;
errlines="";

cat $1 | grep "$3" | while read line
do
        linedate=`date -d "$(echo $line | cut -d " " -f 2)"  '+%s'`
        nowdate=`date '+%s'`

        if [ $(( $nowdate - (60 * $2) )) -le $linedate ]
        then
                $output_logcheck=$[$output_logcheck+1]
                $errlines="${errlines} -- ${line}"
        fi
done;

if [ $output_logcheck -eq 0 ]
then
        echo $outputOK
else
        echo "CRITICAL - There are -= ${output_logcheck} =- $3 -- Lines: $errlines"
fi

Так что я не знаю, что еще попробовать. Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 12 декабря 2011

Проблема в том, что pipe создает SubShell.

изменение

cat $1 | grep "$3" | while read line
do
    ...
done

до

while read line
do
    ...
done <(cat $1 | grep "$3")
1 голос
/ 13 декабря 2011

Как уже отмечалось, оболочка Bash создает подоболочку при каждом открытии канала в цикле.В этом случае переменные внутри цикла являются локальными для цикла.

Один ключ должен заменить (если возможно) оболочку Korn ('ksh') на оболочку Bash.

0 голосов
/ 12 декабря 2011

while выполняется в отдельном процессе. Переменные, которые изменены в контексте этого процесса, все еще сохраняют свои неизменные значения в родительском процессе.

0 голосов
/ 12 декабря 2011

Попробуйте что-то вроде:

## $1 - The file which should be examined
## $2 - The time passed between the checks. If $2 is 5 then all lines from the last 5 minutes are taken
## $3 - The Errormessage to search for

outputOK="OK - nothing happened"
outfile="/tmp/result.$$"

trap { rm $outfile } 0 1 2 3

cat $1 | grep "$3" | (output_logcheck=0; errlines=""; while read line
do
        linedate=`date -d "$(echo $line | cut -d " " -f 2)"  '+%s'`
        nowdate=`date '+%s'`

        if [ $(( $nowdate - (60 * $2) )) -le $linedate ]
        then
                $output_logcheck=$[$output_logcheck+1]
                $errlines="${errlines} -- ${line}"
        fi
done; echo $output_logcheck ":" $errlines > $outfile)

output_logcheck=`cat $outfile| cut -f1 -d:`
errlines=`cat $outfile|cut -f2 -d:`

if [ $output_logcheck -eq 0 ]
then
        echo $outputOK
else
        echo "CRITICAL - There are -= ${output_logcheck} =- $3 -- Lines: $errlines"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...