программирование оболочки - помогает автоматизировать сравнение файлов и отправлять любые изменения по электронной почте - PullRequest
0 голосов
/ 14 апреля 2011

Может кто-нибудь помочь мне с моим сценарием оболочки?Я не могу понять, что я делаю неправильно.Я сократил это как можно лучше.Мне здесь чего-то не хватает с этой логикой.

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

Вот в основном то, что я хочу сделать:

1. get a list (curr.lst) of directories from remote host
2. perform a `diff` on list of directories with (curr.lst) and a previous list (before.lst)
3. if there is a diff (i'm checking this by doing a `du -b` for file size) = 0 bytes, then nothing 
to report
4. if the diff is greater than 0 bytes, then email me the diff

Вот и все.Вот как я это проверил:

1. run the script once
2. edit the before.lst and add/change records to get a diff
3. run again.

Мой вывод:

$ ./tst.sh
The file size is:0 bytes   **there should be a diff because I just edited the file
No diff found

Запустите его снова:

$ ./tst.sh 
The file size is:83 bytes  **now it found the diff, but when I do an ls my diff.out is 0 bytes, thus I have nothing to mail
Could not exit
Detected a change
Null message body; hope that's ok

Мой код:

#!/usr/local/bin/bash

TEST=/dump/stage/procs
BASE=/home/foobar/dev/mon
KEYFILE=/home/foobar/.ssh/mytestfeed-identity

BEFORE="$BASE/before.lst"
CURR="$BASE/curr.lst"
DIFFOUT="diff.out"
MAIL_RECIP="myname@foobar-inc.com"
SIZE=$(du -b "$BASE/$DIFFOUT" | cut -f 1)
ssh -i $KEYFILE user@host ls "$TEST" | perl -nle 'print $1 if m|$TEST/(\S+)|' > "$CURR" 
diff -b -i $BEFORE $CURR > $BASE/$DIFFOUT 2>&1 
echo "The file size is:$SIZE bytes"       2>&1

if [  "$SIZE" = "0" ]; then
    echo "No diff found" 2>&1
    mv $CURR $BEFORE
    exit
else
    echo "Could not exit" 2>&1
fi

if [  "$SIZE" -gt 0 ]; then
        echo "Detected a change" 2>&1
        mailx -s "Changes detected in $TEST dirs" $MAIL_RECIP < $BASE/$DIFFOUT
        mv $CURR $BEFORE 
fi

1 Ответ

3 голосов
/ 14 апреля 2011

Вы выполняете расчет размера (du -b "$BASE/$DIFFOUT") перед тем, как запустить diff.Это означает, что вы получите размер $DIFFOUT, сгенерированный во время последнего запуска скрипта.$DIFFOUT текущего прогона имеет размер 0, потому что вы переместили $CURR в $BEFORE во время последнего запуска скрипта.

Я думаю, вам следует просто переместить строку du после diff строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...