Пока l oop in bash не работает должным образом - PullRequest
0 голосов
/ 15 апреля 2020

Приведенный ниже l oop захватывает две переменные opt1 и opt2, однако l oop выходит без данных.

    #!/usr/bin/ksh
       set -x


       if [ -z ${OPT1} ] || [ -z ${OPT2} ]
       then
       echo "Parameter error" 1>&2
       exit 1
       fi

       if [ $? -ne 0 ]
       then
         echo "switch logfile cannot sync correctly" 1>&2
         exit 1
       fi

   sleep 20

   echo "Check status" >> /home/oracle/scripts/log/$LOGFILE
   OPT2=`sqlplus -S username/password@${db1} << EOF
   set heading off feedback off pagesize 0 verify off echo off numwidth 15 
   select max(ARCHIVED_SEQ#) from v\\$ARCHIVE_DEST_STATUS;
EOF`

OPT1=`sqlplus -S username/password@${db2}<< EOF
set heading off feedback off pagesize 0 verify off echo off numwidth 15 
select max(APPLIED_SEQ#) from V\\$ARCHIVE_DEST_STATUS;
EOF`


if [[ !  ${OPT2} == ${OPT1} ]]
then
    echo "data do not match " 1>&2
else
    echo "data matches" 1>&2
    exit 1
fi
    until [ "$OPT1" -eq "$OPT2" ]; do
    echo "data is equal." | mailx -s "DATA Match" email@mail.com
    sleep 30
    if [ $? -eq 0 ]; then
    break
    fi
    done
    echo "data match is completed" | mailx -s "DATA Match" email@mail.com

Пожалуйста, помогите, поскольку я ожидаю, что l oop продолжится пока обе переменные не станут равными, а затем продолжите выполнение следующих команд в сценарии.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020
# ...
sleep 30
if [ $? -eq 0 ]; then
# ...

Эта команда проверяет код завершения команды sleep, что, скорее всего, не то, чего вы пытаетесь достичь.

0 голосов
/ 15 апреля 2020

Может быть, попробовать что-то вроде этого, используйте подоболочки

#!/usr/bin/env bash

function OPT1(){
  echo xx
}

function OPT2(){
  echo yy
}

# notice the use of a sub-shell instead of variables
# I am not sure about this if and what it's purpose is, do you want to fail if that sql command fails or what?
# if that's what you want, I recommend you implement that behavior in the functions that fetch the data instead of here
if [[ !  "$(OPT2)" == "$(OPT1)" ]]; then
    echo "data do not match " 1>&2
else
    echo "data matches" 1>&2
    exit 1
fi

# anyway, in case you simply want to reevaluate until the data is equal this is all you need
# you might want to add a counter maybe to fail after 50 retries or something
while [[ "$(OPT1)" != "$(OPT2)" ]]; do
  echo "data not equal, waiting before retrying"
  sleep 1
done

echo "data match is completed" 

# at this point the data is matched so you can send your email here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...