shell 自动执行参数脚本并判断(一个折腾的下午)

今天一下午进行了一个小问题的研究,就是希望能把aix主机上各种启动的脚本汇总起来,整理成一个shell启动。这个shell可以判断前一个命令的执行成果,如果执行不成果则跳出。一开始写了如下的代码

#!/usr/bin/ksh

judge()
{
echo ""
echo "Programs starting..."

echo "There are $# Apps need to be done."

#定义日志文件,用日期表示
Time=`date "+%Y%m%d"`
dir=/opt/script/
logFile=${dir}${Time}_run_para.log

#从传入的参数开始执行
for p in "$@"
   do
                #如果存在日志文件,则在日志文件中追加
                if [ -f ${logFile} ]
                                then
                        $p |tee -a ${logFile} 
                                if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} | tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXX The [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
          
      #如果不存在日志文件,则创建日志文件
      else
                         $p |tee ${logFile}
                          if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} | tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXXThe [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
        fi
  done
}

#####################################################
###定义几个要执行的脚本,用绝对路径
var1="touch /opt/script/a.txt"
var2="echo 'helo' >> /opt/script/a.txt"
var3="helo >> /opt/script/a.txt"

#####################################################
judge "${var3}" "${var2}" "{var3}" 


测试的时候发现,第二个if判断根本就执行不下去。一直执行在OK状态,百思不得其解。

大家看看能看出端倪出来吗?

后来,在一个朋友的指点下恍然大悟。他让我转变了思路,不再判断if语句是不是这样嵌套的。而是判断if()内的语句到底输出值是什么;果真如醍醐灌顶啊!!!测试后知道了,任何错误命令后面加了tee之后,echo $? 值都为0,这就是关键。我为什么一直停在判断语法的角度久久不能自拔呢? 就是再测试一个脚本也能测试出来if的成功性。这让我知道了转变思维方式的重要性。从最不起眼的角度思考。也是最简单的处理办法。

但是有什么办法可以一边能在屏幕看到命令输出,一边能把错误定位出来呢? 正在思考中。

现在有了新的研究,管道符号意味着把第一条的输出管道到第二条上,所以echo $?这个表示了最近的输出。怪不得总是得到0正确输出呢。

#!/usr/bin/ksh

judge()
{
echo ""
echo "Programs starting..."

echo "There are $# Apps need to be done."

#定义日志文件,用日期表示
Time=`date "+%Y%m%d"`
dir=/opt/script/
logFile=${dir}${Time}_run_para.log

#从传入的参数开始执行
for p in "$@"
   do
                #如果存在日志文件,则在日志文件中追加
                if [ -f ${logFile} ]
                                then
                        $p >> ${logFile} 2>&1 
                                if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} |tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXX The [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
          
      #如果不存在日志文件,则创建日志文件
      else
                         $p > ${logFile} 2>&1
                          if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} | tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXXThe [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
        fi
  done
}

#####################################################
###定义几个要执行的脚本,用绝对路径
var1="touch /opt/script/a.txt"
var2="echo 'helo' >> /opt/script/a.txt"
var3="helo >> /opt/script/a.txt"

#####################################################
judge "${var3}" "${var2}" "{var3}" 




judge()
{
echo ""
echo "Programs starting..."


echo "There are $# Apps need to be done."


#定义日志文件,用日期表示
Time=`date "+%Y%m%d"`
dir=/opt/script/
logFile=${dir}${Time}_run_para.log


#从传入的参数开始执行
for p in "$@"
   do
                #如果存在日志文件,则在日志文件中追加
                if [ -f ${logFile} ]
                                then
                        $p >> ${logFile} 2>&1 
                                if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} |tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXX The [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
          
      #如果不存在日志文件,则创建日志文件
      else
                         $p > ${logFile} 2>&1
                          if [ $? -eq 0 ]
                                then
                                                                Log_Words="----------------The [ $p ] is OK!      At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
                                        echo ${Log_Words} | tee -a ${logFile}
                                else
                                        Log_Words="XXXXXXXXXXXXXXXXThe [ $p ] is fail!      At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
                            echo ${Log_Words} |tee -a ${logFile}
                            break
                          fi
        fi
  done
}


#####################################################
###定义几个要执行的脚本,用绝对路径
var1="touch /opt/script/a.txt"
var2="echo 'helo' >> /opt/script/a.txt"
var3="helo >> /opt/script/a.txt"


#####################################################
judge "${var3}" "${var2}" "{var3}" 


不钻牛角尖了,重定向这个命令吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值