SHELL 02 数值运算 , if 判断

一. 数值运算

  • 1.整数运算

  • 1.1 基本运算类别:

四则运算

加法:num1 + num2

减法:num1 _ num2

乘法:num1 * num2

整除:num1 / num2

取余数运算

求模:num1 % num2

  •  1.2      expr运算工具

SHELL 02 数值运算 , if 判断_第1张图片

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     //求模
  •  1.3 $[]算式替换

  方法二:使用$[]或(())表达式(需要配合echo命令输出)

[root@server0 ~]# x=1234
[root@server0 ~]# echo $[x+78]
[root@server0 ~]# echo $[x-78]
  • 1.4 变量的自增/减操作

方法三:使用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.5 使用bc实现小数运算

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
  • 1.6 整数运算的局限性

Bash内建机制仅支持整数值运算

-expr命令 ,$[ ]算式替换 不支持有小数的运算

[root@web1 ~]# expr 123 + 45.678
expr: 非整数参数
[root@web1 ~]# echo $[3.14*2]
-bash: 3.14*2: 语法错误: 无效的算术运算符 (错误符号是 ".14*2")
[root@web1 ~]# 

 

  • 1.7 小数值的比较

  • 基本用法

  • -echo “数值1 比较符  数值2” | bc
  • -如果表达式成立,则返回的 计算结果为1,否则返回0
  • -常见比较操作: >, >=,  < , <= , ==,  !=

 

二.条件测试:

Shell脚本的智能化

使用shell脚本获得识别能力?

为命令的执行提供最直接的识别依据

文件或目录的读/写等状态 数值的大小

字符串是否匹配

多条件组合

 

Test测试操作

1.字符串比较

[操作符 字符串 ]

-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 $?

2.整数值比较

[整数值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人登陆系统

3.文件状态测试

SHELL 02 数值运算 , if 判断_第2张图片

[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

 

三.if选择结构

If单分支的语法组成:

if条件测试

then

命令序列

Fi

 

if双分支的语法组成:

if 条件测试

then 命令序列1

 else 命令序列2

fi

 

if多分支的语法组成:

if 条件测试1 ;

then 命令序列1

elif 条件测试2 ;

then 命令序列2

else 命令序列n

Fi

 

列:

检测并判断指定的主机是否可ping通

[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
神功盖世

 

 

 

 

 

你可能感兴趣的:(SHELL,SHELLJ脚本基础)