test3.sh
bacth_date=$1 echo "bacth_date:$1" echo "std_out:$?" echo "${bacth_date}"|grep "20[0-9][0-9][0-9][0-9][0-9][0-9]" echo "std_out:$?" if [ $? -ne 0 ] then echo "[ `date +'%Y-%M-%d'` ]" "[ERROR]" "BATCH_DATE:${bacth_date} is invalid date format ." echo "1" exit 1 fi
[centos@s202 ~]$ sh test3.sh 20191001 bacth_date:20191001 std_out:0 20191001 std_out:0
[centos@s202 ~]$ sh test3.sh 2019xxxx bacth_date:2019xxxx std_out:0 std_out:1
为什么第二次标准输出 1 之后 就不往下运行了
if [ $? -ne 0 ]
why?
我们继续研究:我们在第二个echo "std_out:$?"再加一个echo "std_out:$?" 去看标准输出$?变成了什么
bacth_date=$1 echo "bacth_date:$1" echo "std_out:$?" echo "${bacth_date}"|grep "20[0-9][0-9][0-9][0-9][0-9][0-9]" echo "std_out:$?" echo "std_out:$?" if [ $? -ne 0 ] then echo "[ `date +'%Y-%M-%d'` ]" "[ERROR]" "BATCH_DATE:${bacth_date} is invalid date format ." echo "1" exit 1 fi
[centos@s202 ~]$ sh test3.sh 2019xxxx bacth_date:2019xxxx std_out:0 std_out:1 std_out:0
结论: 运行第二个echo "std_out:$?" 又把标准输出 $?重新置值成了 0
所以 if [ $? -ne 0 ] 不成立 就不运行下面的了
get :echo命令的标准输出是 0
bacth_date=$1 echo "bacth_date:$1" echo "std_out:$?" echo "${bacth_date}"|grep "20[0-9][0-9][0-9][0-9][0-9][0-9]" if [ $? -ne 0 ] then echo "[ `date +'%Y-%M-%d'` ]" "[ERROR]" "BATCH_DATE:${bacth_date} is invalid date format ." echo "1" exit 1 fi
[centos@s202 ~]$ sh test3.sh 2019xxxx bacth_date:2019xxxx std_out:0 [ 2019-12-23 ] [ERROR] BATCH_DATE:2019xxxx is invalid date format . 1
OK:全部运行
代码来源:
对调度脚本日期参数检查(其实这个检查只能对非纯数字进行检查,对过长度比如20190101010101010101就无效):
bacth_date=$1 echo "bacth_date:$1" echo "std_out:$?" echo "${bacth_date}"|grep "20[0-9][0-9][0-1][0-9][0-3][0-9]" >/dev/null if [ $? -ne 0 ] then echo "[ `date +'%Y-%M-%d'` ]" "[ERROR]" "BATCH_DATE:${bacth_date} is invalid date format ." echo "1" exit 1 fi
[centos@s202 ~]$ sh test3.sh 2019xxxx bacth_date:2019xxxx std_out:0 [ 2019-16-23 ] [ERROR] BATCH_DATE:2019xxxx is invalid date format . 1
[centos@s202 ~]$ sh test3.sh 20190101 bacth_date:20190101 std_out:0