成功完成命令后如何给出输出?

成功完成命令后如何给出输出?

我有点坚持下面的脚本,我想在成功完成命令时发出一条消息,但同时如果它不成功,那么它应该继续。

我们有 Oracle 服务器,下面的数据库是 3 节点 rac 服务器。我想要存档的是,当我关闭节点 1 上的实例(例如 TEST11)时,它不会显示成功完成命令的输出。否则,它会抛出一个错误,所以我想将该错误记录在一个文件中,并回显它是否成功或出错。

for DBI  in TEST11 TEST21 TEST31 TEST41
do
DB=$(echo -n $DBI | head -c -1)
echo $DB
export ORACLE_SID=$DBI
export ORACLE_HOME=`grep "^${DBI}:" /etc/oratab | cut -d: -f2 -s`
$ORACLE_HOME/bin/srvctl stop instance -d $DB -i $DBI
done

谢谢穆罕默德DBA

答案1

在 bash 中,$?您会得到上一个命令的返回码。如果上一个命令成功,则返回代码为零,否则为非零。

在下面的示例中,我在文件中搜索包含成功和失败情况的字符串。您可以在脚本中使用此逻辑。

我的脚本 test.sh 的内容

grep "grapes" file1 > /dev/null

if [ $? -eq 0 ]
then
    echo "Success. Perform success action"
else
    echo "Failure.. Do Failure action"
fi

以下是示例执行:

#cat file1
apple
grapes

#sh test.sh
Success. Perform success action


#cat file1
apple

#sh test1
Failure.. Do Failure action

答案2

假设 srvctl向调用 shell 返回有用的退出状态,我们可以在if脚本的语句中使用它来输出消息,具体取决于数据库是否成功关闭。

#!/bin/bash

export ORACLE_SID ORACLE_HOME

for ORACLE_SID in TEST{1..4}1
do
        # The database name is the same as the SID,
        # but with the last character removed.
        db=${ORACLE_SID%?}

        # Get the ORACLE_HOME directory by parsing /etc/oratab.
        ORACLE_HOME=$( awk -F : '$1 == ENVIRON["ORACLE_SID"] { print $2 }' /etc/oratab )

        # Try stopping the service.
        if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
        then
                # Report success.
                printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
        else
                # Report failure, log to file.
                printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
                tee -a error.log >&2
        fi
done

上面的脚本以可移植的方式重新实现了您自己的大部分脚本,删除了对外部实用程序的不必要的调用,不使用超出需要的变量,并添加了一条if语句,该语句要么输出有关成功停止服务的消息,要么输出有关无法停止服务的消息。停止服务。如果服务未停止,相关消息将另外添加到error.log当前目录中调用的日志文件中。


上述脚本的一个变体,避免在每次迭代中读取整个/etc/oratab,而是解析循环中的文件,测试我们是否找到了有趣的ORACLE_SID,否则跳到下一次迭代。该if语句与第一个脚本相同。

#!/bin/bash

export ORACLE_SID ORACLE_HOME

while IFS=: read -r ORACLE_SID ORACLE_HOME
do
        # Skip uninteresting SIDs.
        [[ $ORACLE_SID != TEST[1-4]1 ]] && continue

        db=${ORACLE_SID%?}

        if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
        then
                printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
        else
                printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
                tee -a error.log >&2
        fi
done </etc/oratab

[[ $ORACLE_SID != TEST[1-4]1 ]]您可以通过将测试更改为从上面的脚本中删除所有“bash-isms”

case $ORACLE_SID in (TEST[1-4]1) : ;; (*) continue; esac

相关内容