四则运算
加法:num1 + num2
减法:num1 _ num2
乘法:num1 * num2
整除:num1 / num2
取余数运算
求模:num1 % num2
Shell中的运算
expr 1 +1 常量计算,注意运算符号两边有空格
[root@server0 ~]# a=10
[root@server0 ~]# expr $a +1 变量计算
[root@server0 ~]# expr $a \* 1 乘法运算要加转义符号
案例1:Shell中的数值运算
使用expr、$[ ]、let等整数运算工具:
定义变量X=1234,然后计算X与78的四则运算及求模结果
使用bc实现小数运算操作:以交互方式计算12.34与56.78的四则运算结果,另外再以非交互方式重复上述计算,最多显示4位小数
方法一:使用expr命令
[root@server0 ~]# x=1234 //定义变量x
[root@server0 ~]# expr $x \* 78 //乘法,操作符应添加\转义
96252
[root@server0 ~]# expr $x + 78 //加法
1312
[root@server0 ~]# expr $x - 78 //减法
1156
[root@server0 ~]# expr $x / 78 //除法
15
[root@server0 ~]# expr $x % 78 //求模
方法二:使用$[]或(())表达式(需要配合echo命令输出)
[root@server0 ~]# x=1234
[root@server0 ~]# echo $[x+78]
[root@server0 ~]# echo $[x-78]
方法三:使用let命令 不显示结果 可以定义变量的值
[root@server0 ~]# a=10
[root@server0 ~]# let b=a+1 //定义新变量b
[root@server0 ~]# echo $b //查看变量b的值,等于10+1
[root@server0 ~]# let a=a+2 //变量的自增减,此时a=10+2
[root@server0 ~]# echo $a //查看结果
[root@server0 ~]# let a++ //主流写法,相当于let a=a+1
[root@server0 ~]# let a-- //主流写法,相当于let a=a-1
[root@server0 ~]# let a+=10 //主流写法,相当于let a=a+10
[root@server0 ~]# let a%=3 //主流写法,相当于 let a=a%3
1. 交互式运算
[root@server0 ~]# bc //交互式运算
12.34 + 56.78
12.34 - 56.78
12.34 * 56.78
12.34 / 56.78
quit 或ctrl +c //退出交互计算机
2.非交互式运算
[root@server0 ~]# echo 'scale=4;12.34+5.678' | bc
[root@server0 ~]# echo 'scale=4;12.34*5.678' | bc
[root@server0 ~]# echo 'scale=4;12.34/5.678' | bc
Bash内建机制仅支持整数值运算
-expr命令 ,$[ ]算式替换 不支持有小数的运算
[root@web1 ~]# expr 123 + 45.678
expr: 非整数参数
[root@web1 ~]# echo $[3.14*2]
-bash: 3.14*2: 语法错误: 无效的算术运算符 (错误符号是 ".14*2")
[root@web1 ~]#
使用shell脚本获得识别能力?
为命令的执行提供最直接的识别依据
文件或目录的读/写等状态 数值的大小
字符串是否匹配
多条件组合
[操作符 字符串 ]
-z 字符串的值为空
-n 字符串的值不为空(相当于! -z)
[字符串1 操作符 字符串2 ]
== 两个字符串相同 != 两个字符串不同
列:字符串测试
1.1.Root用户: 比较字符串是否相同
[root@server0 ~]# [ $USER == "root" ] //测试
[root@server0 ~]# echo $? //结果0对,非0错
普通用户:
[root@server0 ~]# useradd abc
[root@server0 ~]# su - abc
[abc@server0 ~]$ [$USER == "root" ]
[abc@server0 ~]$ echo $?
1.2比较两个字符串
[abc@server0 ~]$ [$USER != "root" ]
[root@server0 ~]# [ $USER != "root" ]
[root@server0 ~]# echo $?
[整数值1 操作符 整数值2 ]
-eq 等于
-ne 不等于
-ge 大于或等于
-le 小于或等于
-gt 大于
-lt 小于
列:
[root@server0 ~]# [ $a -lt 5 ]
[root@server0 ~]# echo $?
[root@server0 ~]# [ $a -lt 5 ] && echo "满足条件" || echo "不满足条件"
不满足条件
[root@server0 ~]# [ $a -ne 5 ] && echo "满足条件" || echo "不满足条件"
满足条件
练习:
使用位置变量创建添加用户的脚本,如果用户没有输入用户名,则退出脚本
[root@server0 ~]# cd /opt
[root@server0 opt]# rm -rf *
[root@server0 opt]# vim test1
#!/bin/bash
read -p "请输入用户名" u
[ -z $u ] && exit
useradd $u
[root@server0 opt]# bash test1
请输入用户名
每分钟检测系统中登陆账户的数量,如果大于3人登陆,发邮件给管理员报警
[root@server0 opt]# who | wc -l
[root@server0 opt]# vim test2
#!/bin/bash
s=`who | wc -l`
[ $s -gt 3 ] && echo "报警! 超过3人登陆系统" | mail -s test root
脚本写完之后赋予x权限,并放入计划任务中
[root@server0 opt]# chmod +x /opt/test2
[root@server0 opt]# crontab -e
* * * * * /opt/test2 //精确到1分钟
[root@server0 opt]#
您在 /var/spool/mail/root 中有新邮件
[root@server0 opt]# mail //查看邮件
& 1
报警!超过3人登陆系统
[root@server0 opt]# [ -e abc ] //判断abc对象在不在,不考虑文件类型
[root@server0 opt]# echo $? //输出结果为0存在,非0 不存在
[root@server0 opt]# [ -d abc ] //判断abc文件有没有,且必须是个目录
[root@server0 opt]# echo $?
[root@server0 opt]# [ -f abc ] //判断abc文件有没有,且必须是个普通文件
[root@server0 opt]# echo $?
检测有无$1目录,有则退出脚本,无则创建
[root@server0 opt]# vim test3
#!/bin/bash
[ -d $1 ] && exit
mkdir $1
[root@server0 opt]# bash test3
[root@server0 opt]# ls
test1 test2 test3
[root@server0 opt]# bash test3 abc
[root@server0 opt]# ls
abc test1 test2 test3
[root@server0 opt]# vim test4
#!/bin/bash
ping -c 3 -i 0.2 -W 1 172.25.0.10 &> /dev/null
if [ $? -eq 0 ];then
echo "通了"
else
echo "不通"
fi
[root@server0 opt]# bash test4
[root@server0 opt]# vim test5
#!/bin/bash
a=$[RANDOM%11]
read -p "请给一个数字(0-10)" n
if [ $a -eq $n ];then
echo "猜对了"
elif [ $n -gt $a ];then
echo "猜大了"
else
echo "猜小了"
fi
[root@server0 opt]# bash test5
请给一个数字(0-10)n
[root@server0 opt]# vim test5
#!/bin/bash
a=$[RANDOM%11]
read -p "请给一个数字(0-10)" n
[ -z $n ] && exit
if [ $a -eq $n ];then
echo "猜对了" && exit
elif [ $n -gt $a ];then
echo "猜大了"
else
echo "猜小了"
fi
read -p "请给一个数字(0-10)" n
if [ $a -eq $n ];then
echo "猜对了" && exit
elif [ $n -gt $a ];then
echo "猜大了"
[root@server0 opt]# bash test5
大于等于90 神功绝世 大于等于80,
小于90 登峰造极 大于等于70,
小于80 炉火纯青 大于等于60,
小于70 略有小成 ,
小于60 初学乍练.
[root@server0 opt]# vim test6
#!/bin/bash
read -p "请输入积分(0-100) :" JF
if [ $JF -ge 90 ];then
echo 神功盖世
elif [ $JF -ge 80 ];then
echo 登峰造极
elif [ $JF -ge 70 ];then
echo 炉火纯青
elif [ $JF -ge 60 ];then
echo 略有小成
else
echo 初学乍练
fi
[root@server0 opt]# bash test6
请输入积分(0-100) :90
神功盖世