как использовать вложенный if и выполнять правильные проверки файлов в unix - PullRequest
1 голос
/ 18 сентября 2010

Нужна помощь по написанию сценариев оболочки, особенно с моей if-then-else логикой.Я хочу объединить оба условия, но не уверен, что проверки файлов будут работать одинаково?Должен ли я делать что-то вроде вложенного, если ??Мой скрипт использует операторы if для проверки файлов, чтобы увидеть, существуют ли они, а затем сделать что-то ..

Возможно, есть и лучший способ выполнить проверку файлов.

Любая помощь, критика будет принята с благодарностью.Спасибо.

Вот мой код, он вроде работает.

if [ $# != 1 ]; then
    echo "Usage: getlogs.sh <remote-host>" 2>&1
    exit 1
fi

#Declare variables
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/mysql/dev/logs/
NEWLOG="foo-temp.log"
export REMOTE_MYCNF STAMP SHORTNAME
export REMOTE_DIR REMOTE_GZ

#Copy file over
echo "START..." 2>&1
test -f $BACKUP_DIR$1.mysoft.log
if [ $? = 0 ]; then
   echo "Local log file exists, clean up for new copy..." 2>&1
   /bin/rm $BACKUP_DIR$1.mysoft.log
   exit 0
   else
        echo "File does not exist, getting a new copy..." 2>&1
fi

echo "Checking remotely in $1 for foo logfile $REMOTE_MYCNF $STAMP" 2>&1
if [ ! -f $REMOTE_MYCNF ]; then
   echo "File exists remotely, creating new logfile and copy here...." 2>&1
   ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
   ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
   /usr/bin/scp $1:$REMOTE_DIR$NEWLOG $BACKUP_DIR$1.mysoft.log
   echo "end remote copy" 2>&1
   echo "Cleaning up remote files" 2>&1
   ssh $1 "rm $REMOTE_DIR$NEWLOG"
   exit 0
   else
        echo "Unable to get file" 2>&1
        exit 0
fi

Обновлен код с помощью справки:

    if [ -f $BACKUP_DIR$1.mysoft.log ]; then
       echo "Local log file exists, clean up for new copy..." 2>&1
       /bin/rm $BACKUP_DIR$1.mysoft.log
       exit 0
    else
        echo "File does not exist, getting a new copy..." 2>&1
        echo "Checking remotely in $1 for foo logfile $REMOTE_MYCNF $STAMP" 2>&1
               if [ ! -f $REMOTE_MYCNF ]; then
                    echo "File exists remotely, creating new logfile and bring a copy here...." 2>&1
                    ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
                    ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
                    /usr/bin/scp $1:$REMOTE_DIR$NEWLOG $BACKUP_DIR$1.mysoft.log
                    echo "end remote copy" 2>&1
                    echo "Cleaning up remote files" 2>&1
                    ssh $1 "rm $REMOTE_DIR$NEWLOG"
                    exit 0
               else
                    echo "Unable to get file" 2>&1
                    exit 0


         fi
fi

1 Ответ

2 голосов
/ 18 сентября 2010

Тест файла можно объединить в одно утверждение, например:

if [ -f $BACKUP_DIR$1.mysoft.log ]; then

На первый взгляд не похоже, что вам нужно экспортировать какие-либо переменные.

Если вы намереваетесь выполнить блок if [ ! -f $REMOTE_MYCNF ]; then в пределах else предыдущего if, просто переместите его в него.

if ...
then
   foo
else
    if ...
    then
        bar
    else
        baz
    fi
fi

Если вам нужно проверить две вещи:

if [ "$foo" = "bar" && "$baz" = "qux" ]

Всегда указывайте свои переменные.

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

remote_host=$1

Если вы хотите echo ошибок, чтобы stderr делал это так:

echo "Message" >&2

Как у вас есть, вы выводите сообщение и любые ошибки, которые само эхо может выдавать (довольно редко) на стандартный вывод.

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