今天一下午进行了一个小问题的研究,就是希望能把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语句是不是这样嵌套的。而是判断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}"
不钻牛角尖了,重定向这个命令吧。