#shell #unix #if-statement #logic
#оболочка #unix #if-оператор #Логические
Вопрос:
Кто-нибудь может помочь мне с моим сценарием оболочки? Я не могу понять, что я делаю не так. Я сократил это как мог. Я чего-то не понимаю в этой логике.
Мой процесс довольно прост, но, по-видимому, я неправильно его кодирую.
Вот в основном то, что я хочу сделать:
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>amp;1
echo "The file size is:$SIZE bytes" 2>amp;1
if [ "$SIZE" = "0" ]; then
echo "No diff found" 2>amp;1
mv $CURR $BEFORE
exit
else
echo "Could not exit" 2>amp;1
fi
if [ "$SIZE" -gt 0 ]; then
echo "Detected a change" 2>amp;1
mailx -s "Changes detected in $TEST dirs" $MAIL_RECIP < $BASE/$DIFFOUT
mv $CURR $BEFORE
fi
Ответ №1:
Вы выполняете вычисление размера ( du -b "$BASE/$DIFFOUT"
) перед запуском diff
. Это означает, что вы получаете размер $DIFFOUT
, сгенерированный во время последнего запуска скрипта. $DIFFOUT
Размер текущего запуска равен 0, потому что вы переместились $CURR
в $BEFORE
во время последнего запуска скрипта.
Я думаю, вам следует просто перемещать du
строку за diff
строкой.
Комментарии:
1. Спасибо! я думал, что объявленная мной переменная не будет вызвана в тот момент. теперь все работает нормально. 🙂