shell中的逻辑判断一般用if语句,if语句中通常用[]
来表示条件测试,可以比较字符串、判断文件是否存等。备注:[ ] 中表达式两边与括号之间要有空格
if … else 语句常用基本的语法如下:
1.if [];then fi
语句
建一个测试脚本test.sh如下
#!/bin/bash
a=$1
b=$2
if [ $a == $b ];then
echo "a and b is equal"
fi
if [ $a != $b ];then
echo "a and b is not equal"
fi
执行命令sh test.sh 2 3
给参数$1和$2赋值2和3,输出结果a and b is not equal
不加else的if语句表达式成立执行then后面的语句,表达式不成立则不执行任何命令。
2.if [];then else fi
语句
if [ expression ];then
executed Statement_expression_true
else
executed Statement_expression_false
fi
备注:expression表达式 和方括号[ ]
之间必须有空格,否则会有语法错误。如果表达式成立,then后面的语句将会被执行;如果表达式不成立则执行else后面的语句。
3.if [];then elif []; then else fi
语句,哪个expression表达式成立则执行哪个then后面的语句,否则执行else后面的语句。
if [ expression1 ];then
executed Statement_expression1_true
elif [ expression2 ];then
executed Statement_expression2_true
else
executed Statement_expression1_2_false
fi
#!/bin/bash
a=$1
b=$2
if [ $a == $b ];then
echo "a and b is equal"
elif [ $a -lt $b ];then
echo "a less than b"
else
echo "a bigger than b"
fi
例如建个测试脚本test.sh
如上,执行命令sh test.sh 2 3
给参数$1
、$2
赋值2
、3
,输出结果a less than b
;执行sh test.sh 3 2
结果为a bigger then b
#!/bin/bash
a=$1
b=$2
if [ $a == $b ];then
echo "a and b is equal"
else
if [ $a -lt $b ];then
echo "a less than b"
else
echo "a bigger than b"
fi
fi
上述脚本,if … else 语句嵌套使用的效果与if … elif … fi 语句效果类似,但是if … elif … fi 语句要精简些
4.if … else 语句也经常与 test 命令结合使用,test 命令用于检查某个条件是否成立,与方括号[ ]
功能类似
#!/bin/bash
a=$1
b=$2
if test $a == $b;then
echo "a and b is equal"
else
echo "a and b is not equal"
fi
例如上述脚本,其中if test $a == $b;
与if [ $a == $b ];
效果一样。
5.if语句常用命令选项有:
==
or =
: 等于
-eq
: 等于
-ne
:不等于
-gt
:大于
-ge
:大于等于
-lt
:小于
-le
:小于等于
命令选项 | 描述 |
---|---|
if [ a = b ] | a与b是否相等 (a、b是数值) |
if [ a -ge b ] | a 是否大于等于 b |
if [ a -gt b ] | a 是否大于 b |
if [ a -le b ] | a 是否小于等于 b |
if [ a -lt b ] | a 是否小于 b |
if [ a -ne b ] | a 是否不等于 b |
if [ str1 = str2 ] | str1是否与str2相同(str1、str2是字符串) |
if [ str1 != str2 ] | str1是否与str2不同 |
if [ str1 < str2 ] | str1是否小于str2 |
if [ str1 > str2 ] | str1是否da于str2 |
if [ -n str ] | 判断str长度是否非零 |
if [ -z str ] | str长度是否为0 |
if [ -d file ] | 判断file是否为一个目录 |
if [ -e file ] | 判断file是否存在 |
if [ -f file ] | 检查file文件是否存在 |
if [ -r file ] | 判断file是否存在并可读 |
if [ -s file ] | 判断file是否存在并非空 |
if [ -w file ] | 判断file是否存在并可写 |
if [ -x file ] | 判断file是否存在并可执行 |
例如下面脚本判断压缩包文件是否存在
#!/bin/bash
Day=`date -d yesterday +%Y%m%d`
FILE=access_${Day}.log.tgz
WORK_DIR= /data/nginx/logs
if [ -f ${WORK_DIR}/${FILE} ];then
echo "OK"
else
echo "${FILE} backup fail" > error.log
fi
例如判断日志文件中是否存在error
#!/bin/bash
WORK_DIR=/home/hadoop/ktl_wks
LOG_DATE=`date +%Y%m%d`
LOG_TIME=`date +%H%M%S`
LOGFILE=${WORK_DIR}/log/${LOG_DATE}${LOG_TIME}_start.log
#检查执行是否正常
ERR_LOG=`cat ${LOGFILE} | grep 'error' | awk -F ' ' '{print $1}'`
if [ -z ${ERR_LOG} ];then
echo `date +'%Y-%m-%d %H:%M:%S'`" 日志检查结束,检查结果为:正常." >> ${LOGFILE} 2>&1
else
echo `date +'%Y-%m-%d %H:%M:%S'`" 日志检查结束,检查结果为:发现异常!!" >> ${LOGFILE} 2>&1
fi