上一篇主要讲解完位置参数变量、预定义变量,涉及到的知识点有$n,$*,$@,$#,$$,$!,$?
本篇主要讲解算术运算符及条件判断
算术运算符
包含 + - * / %(取余)
使用方式有三种:
①$((运算式))
②$[运算式]
③expr `运算式`
这里的第三种方式不是单引号,而是我们之前介绍过的反引,在左上角的esc下面,数字1的左边,英文状态下输
#!/bin/bash
#使用三种方式计算5*(9-6)的结果
#第一种方式
echo $((5*(9-6)))#第二种方式
echo $[5*(9-6)]#第三种方式
Num=`expr 9 - 6`
echo `expr 5 \* $Num`
这里我们直观的看到第三种方式最麻烦,首先是不能直接一个表达式结束,其次这种方式的算术运算符左右必须得有空格,最后如果是乘法还得写\进行转义
保存退出后,授权,执行。
三个结果都为15,这里我就不贴图了。
条件判断
格式:
最简单版
if [条件]
then 执行内容
fi
完整版
if [条件]
then 执行内容
elif [条件]
then 执行内容
else
执行内容
fi
sh的条件语句的执行内容不能为空,fi为此流程控制结束
这里的条件,类似js的逻辑,如果你只写一个变量在里面,那么会判断这个变量是否有值,如果没有这个变量,或这个变量没值,或空值(空值包括 ""和" ")那么这个条件是不成立的。
但是我们用的更多的是进行逻辑判断参与的
比如我们可以使用 == 来判断等式两边是否相等
还是在/usr/local/shell目录下 vi condition.sh
#!/bin/bash
NUM1=5
NUM2=5
if [ $NUM1 == $NUM2 ]
then echo "数字相等"
fi#-----------分割,上面判断数字,下面判断字符串
STR1="ss"
STR2="ss"
if [ $NUM1 == $NUM2 ]
then echo "字符串相等"
fi
注意:空格 ,中括号[]要用空格跟其他内容隔开, == 也要两边有空格
授权,运行后
用于判断的运算符还有什么呢?
运算符 | 说明 |
---|---|
-eq | 判断是否相等,类似 == |
-ne | 判断是否不相等,类似 != |
-gt | 判断大于吗?类似> |
-lt | 判断小于吗?类似< |
-ge | 判断大于等于吗?类似>= |
-le | 判断小于等于吗?类似<= |
上面我们举了==的例子,这里又出现了 -eq也可以判断是否相等,那==和-eq有区别吗?有的,-eq只能判断数字,而==可以判断字符串,也可以判断数字
把刚才的condition.sh重新编辑一下,vi condition.sh
#!/bin/bash
#-----------数字关系判断------------
NUM1=10
NUM2=15
if [ $NUM1 -gt $NUM2 ]
then echo "Num1大于Num2"
elif [ $NUM1 -lt $NUM2 ]
then echo "Num1小于Num2"
else
echo "相等"
fi
#-----------------------另一种方式---------
echo "----------------分割线--------------------"
if [ [$NUM1>$NUM2] ]
then echo "Num1大于Num2哦哦"
elif [ [$NUM1<$NUM2] ]
then echo "Num1小于Num2哦哦"
else
echo "相等哦哦"
fi
上面用了两种方式实现判断NUM1跟NUM2的大小判断。
第二种方式使用 [ [] ]的方式,那这里面就可以写我们熟悉的><了
除了对数字的判断,sh还提供了对文件的判断,常用的有
-r | 有读的权限吗? |
-w | 有写的权限吗? |
-x | 有可执行的权限吗? |
-e | 文件是否存在 |
-d | 文件存在且是一个目录 |
-f | 文件存在且是一个常规文件 |
我们再编辑一下condition.sh,
做一个判断,判断/root/demo.txt文件是否存在,如果存在,那么他有可读权限吗?
#!/bin/bash
#----------判断文件-------------
if [ -e /root/demo.txt ]
then echo "文件存在"
if [ -r /root/demo.txt ]
then echo "有可读的权限"
fi
else
echo "文件不存在"
fi
保存退出后,执行。执行第一次因为这个文件不存在,那么输出内容"文件不存在",然后我们创建该文件,再执行,可发现变化
另外,sh还提供了case语法进行流程控制,类似Java的switch语法,判断某个变量匹配相等的值,语法结构:
case 变量 in
"值1")
执行语句
;;
"值2")
执行语句
;;
......(省略其他)
"*")
以上都不满足的执行语句
;;
esac
case的案例我就不再举例了。
最后出个练习试试手吧
练习
传入参数,给一个分数,如果这个分数在90分以上,输出优秀,70-90分,输出良好,50-70分,输出中等,30-50分,输出较差,30分以下,输出很差