shell编程之shell 运算

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之shell 运算相关的知识,希望对你有一定的参考价值。

shell 四则运算

赋值运算:=

赋值运算符:
	=	:赋值运算符

演示:
	a=10
	name='pdd'

备注:字符串必须用引号引起来

算术运算(四则运算):

  • expr命令:不能开方,必需有空格。
  • let命令:变量之间的加减乘除用let命令,不能有空格
  • $(())命令:空格随意,不加反引号
  • bc命令:只有bc命令能做浮点运算

expr命令在脚本中用法:

#!/bin/bash
# 必须有空格
# 变量必须加$符号
num1=10
num2=3
# 第一种:变量赋值输出
a=`expr $num2 - $num1`
echo $a
# 第二种:直接命令输出
echo "`expr $num1 - $num2`"

let命令在脚本中用法:

#!/bin/bash
# 需要变量赋值然后输出变量
# 变量的$符可不加,运算中不可有空格
num1=10
num2=3
let a=num1+num2
echo $a

$(())命令在脚本中用法:

#!/bin/bash
# 运算时变量$符号可不加
# 括号内空格可随意,有没有空格都行
# 注意:没有反引号
num1=10
num2=3
# 第一种:赋值输出
a=$((num2-num1))
echo $a
# 第二种:直接输出
echo "$((num1-    num2))"

bc命令在脚本中用法:

#!/bin/bash
# 需要加上$符号
# 运算时空格随意
# 只能变量赋值输出
num1=1.23
num2=2.34
a=`echo "scale=2;$num2- $num1"|bc`
echo $a

以上四个命令在终端中运算:

算术运算符:
	+-*/	:四则运算符,加减乘除
	扩展:
		% :取余
		** :开方

	运算命令:expr、let、$(())、bc命令。前三个只能做整数运算;bc命令能做浮点运算


演示:		
	# expr命令:只能做整数运算,格式比较古板,注意空格隔开
		[root@server ~]# expr 5 \\* 3		=>	注意*需要转义,否则会人为是通配符
			15
		[root@server ~]# expr 1 / 3			
			0
		[root@server ~]# expr 5 / 3
			1
		[root@server ~]# expr 5 / 2		=>	注意:只取商的整数值,余数不取,若商小于1则返回0
			2
		[root@server ~]# expr 7 % 2		=>	取余数
			1


	# let命令:只能做整数运算,必须先赋值变量,再打印变量,运算符不需要在转义符\\
		[root@server ~]# let a=2*3;echo $a
			6
		[root@server ~]# let a=5/2;echo $a
			2
		[root@server ~]# let a=5%2;echo $a
			1
		[root@server ~]# let a=5**2;echo $a
			25
	
		[root@server ~]# a=6
		[root@server ~]# let a++;echo $a	>	a++ 代表 a=a+1
			7
	
		[root@server ~]# a=6
		[root@server ~]# let a--;echo $a	=>	a-- 代表 a=a-1
			5
	
		[root@server ~]# a=6
		[root@server ~]# let a-=3;echo $a	=>	a-=3 代表 a=a-3
			3
	
		[root@server ~]# a=6
		[root@server ~]# let a+=3;echo $a	=>	a+=3 代表 a=a+3
			9
	
	
	#l $(()),可以在括号内做算数运算
		[root@server ~]# echo $((10*3))
			30
		[root@server ~]# echo $((10/3))
			3
		[root@server ~]# echo $((10%3))
			1
		[root@server ~]# echo $((10**3))
			1000

	
	# bc命令(交互式),如果没有请安装:yum install -y bc
		说明:直接在终端输入"bc"命令。需要指定"scale=N"告诉bc取N个小数点

		[root@server ~]# bc
			bc 1.06.95
			Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
			This is free software with ABSOLUTELY NO WARRANTY.
			For details type `warranty'.
			10*3		=>	输入完毕后直接回车
			30
			
			10/3
			3
			
			10%3
			1
			
			scale=3		=>	需要通过"scale"指定取小数点后几位
			10/3
			3.333

		[root@server ~]# echo "scale=2;100/3" |bc	=>	不通过交互式做浮点运算
			33.33

shell 逻辑运算

逻辑运算介绍:

完成一个任务需要多个条件才能满足,或者是多个条件只要满足一个即可,这就是逻辑运算。通过多个条件判断结果,才能得出结论

逻辑运算应用场景:多条件同时判断

逻辑运算符:

  • 逻辑与:&&

  • 逻辑或:||

  • 逻辑非:!

逻辑运算符说明:

逻辑运算注意事项:
	"逻辑与""逻辑或"运算都需要两个或以上条件
	"逻辑非"运算只能一个条件(非真即假条件)
		
		逻辑与运算:一假永假;全真为真
		逻辑或运算:一真永真;真假永真
		逻辑非运算:非真为假;非假为真


	"逻辑与""逻辑或"的短路运算:
		#l	逻辑与中靠前的条件中出现了假,后面的条件就不在判断了,因为已经判断为假就会结束运算
				=>	即必须满足全部条件才为真,只要判断出一个条件为假就判断不满足条件
				
		#l	逻辑或中靠前的条件中出现了真,后面的条件就不在判断了,因为已经判断为真就会结束运算
				=>	即只要判断全部条件中的其中一个为真就判断满足条件

	#l 备注:判断条件是从前往后判断的

整数比较运算

  • 通过test命令比较整数大小

  • 浮点数比较运算可以先将其转换成整数再进行比较

  • 通过变量赋值,调用变量不需要用双引号引起来。如 :if [ $a -gt $b ]就可以了

test命令比较整数运算:

命令格式:
	# test num1 选项 num2
		选项说明:
			精确比较:
				-eq:等于
				-gt:大于
				-lt:小于
			模糊比较:
				-ge:大于或等于
				-le:小于或等予以
				-ne:不等于
	判断整数:
			test 整数1 -eq 整数2    =>	整数相等
			test 整数1 -ge 整数2    =>	整数1大于等于整数2
			test 整数1 -gt 整数2    =>	整数1大于整数2
			test 整数1 -le 整数2    =>	整数1小于等于整数2
			test 整数1 -lt 整数2    =>	整数1小于整数2
			test 整数1 -ne 整数2    =>	整数1不等于整数2


演示:
	#l 返回0表示上一条命令执行正常,非0为执行异常
		[root@server ~]# test 1 -eq 1; echo $?
			0
		[root@server ~]# test 3 -eq 3;echo $?
			0
		[root@server ~]# test 5 -gt 3;echo $?
			0
		[root@server ~]# test 5 -lt 3;echo $?
			1

浮点比较运算

处理浮点型数字前需要将其转换成整数类型,再进行比较

方法:

  • 需要比较的浮点数同时放大N倍

  • 处理成整形

  • 再进行比较
    通过脚本比较运算:

在脚本中浮点数处理成整形:
	num=`echo "scale=2;float_num*100"|bc|cut -d "." -f1`

#l 备注:浮点数是几位就将其乘上多少位的倍数,然后取整数值进行比较

字符串比较运算

=:一个等号时赋值

==:两个等于号是比较等号两边大小

test命令比较字符串运算:

命令格式:
	# test 选项 字符串
		选项说明:
			-n:test –n 字符串   	 =>	字符串的长度不为空时,返回真
			-z:test –z 字符串      	 =>	字符串的长度为空时,返回真
					
			= :test 字符串1 = 字符串2       =>	字符串是否相等,是返回真
			!=:test 字符串1! = 字符串2      =>	字符串是否不等,不等返回真

字符串比较在脚本中用法:

#!/bin/bash
# 只有打印正确账号密码才能输出hello word
# 账号:root    密码:123456
read -p "login:" user
read -p "passwd:" pw

# 比较字符串是否为空
if [ -z "$user" ];then
     echo "输入账号为空"


elif [ "$user" == "root" ];then
       if [ -z "$pw" ];then
            echo "输入的密码为空"

       elif [ "$pw" ==  "123456" ];then
            echo "欢迎登录:$user"

       else
             echo "你输入的密码错误"
       fi

else
     echo "你输入的账号错误"

fi

文件比较运算

tes命令比较文件:

命令格式:
	# test 选项 选项的值
		选项说明:
			判断文件:
				-b f:文件是块设备文件时,返回真
				-c f:文件是字符设备文件时,返回真
				-h f:文件是符号链接文件时,返回真 (-L f)
				-S f:文件是socket时,返回真
				-p f:文件是一个命名管道时,返回真	
				
				"-f f:f是普通文件时,返回真"
				-d p:p是一个目录时,返回真
				"-e fp:文件或目录存在时,返回真"
				
				-u fp:文件或目录设置了SUID 位时,返回真
				-O fp:文件或目录属于有效用户ID时,返回真(字母O 大写)
				
				-g fp:文件或目录设置了组id时,返回真
				-G p:文件或目录属于有效组ID时,返回真
				
				-k fp:文件或目录设置了"粘滞"位时,返回真							
				-s f:文件大小大于0时(非空,有内容),返回真
				
			   -t fd:文件描述符是在一个终端打开时(fd 默认为 1),返回真
				
				-r fp:文件或目录可读时,返回真
				-w fp:文件或目录可写时,返回真
				-x fp:文件或目录可执行时,返回真								
				
				f1 -nt f2:文件1 比文件2 新时(由修改日期决定),返回真
				f1 -ot f2:文件1 比文件2旧时(由修改日期绝对),返回真
				f1 -ef f2:两个文件是否为同一个文件(硬连接),主要判断两个文件是否指向同一个inode号

以上是关于shell编程之shell 运算的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程入门

linux之Shell编程--Shell基本运算符之算数运算符和关系运算符实例演示

linux之Shell编程--Shell基本运算符之字符串运算符和文件运算符实例演示

shell脚本编程之算数运算

shell编程之常用系统变量自定义变量特殊变量运算符

shell编程之元字符