if 判断语句与shell运算

Posted 锦衣admin

tags:

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

if 与 shell 运算

if 条件是浮点型比较运算

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

方法:

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

  • 处理成整形

  • 再进行比较

if 实现浮点型比较运算:

#l 编写脚本:
	[root@server ~]# vim float.sh
		#!/bin/bash
		# 对外部传参用法做出提示,表示对外传参的两个参数做比较
		if [ $# -ne 2 ]
		  then
		        echo 'Usege:'$0' args1 args2'
		        exit 8
		fi
		# 对外部传参的浮点数转换成整数并取整
		num1=`echo "scale=2;$1*100"|bc|cut -d "." -f1`
		num2=`echo "scale=2;$2*100"|bc|cut -d "." -f1`
		# 通过if语句比较
		if [ $num1 -gt $num2 ]
		  then
		        echo "$1 > $2"
		
		  elif [ $num1 -lt $num2 ]
		        then
		                echo "$1 < $2"
		else
		        echo "$1 = $2"
		fi


#l 运行脚本:
	[root@server ~]# sh float.sh 3.33 4.55
		3.33 < 4.55
	[root@server ~]# sh float.sh 3.33 4.55 12
		Usege:float.sh args1 args2
	[root@server ~]# sh float.sh 3.33
		Usege:float.sh args1 args2

if 条件是文件类型

判断文件类型时

if 判断文件表达式

命令格式:
	if [ 选项 文件路径 ]
		then
			return 
	fi

		选项说明:
			文件类型:
				-b f:文件是块设备文件时,返回真
				-c f:文件是字符设备文件时,返回真
				-h f:文件是符号链接文件时,返回真 (-L f 软连接返回真)
				-S f:文件是socket 时,返回真
				-p f:文件是一个命名管道时,返回真
				-f f:为普通文件时,返回真
				-d p:p是一个目录时,返回真
				-e fp:文件或目录存在时,返回真
			文件权限:
				-r fp:文件或目录可读时,返回真
				-w fp:文件或目录可写时,返回真
				-x fp:文件或目录可执行时,返回真	
			文件当新旧:
				f1 -nt f2:文件1 比文件2 新时(由修改日期决定),返回真
				f1 -ot f2:文件1 比文件2 旧时(由修改日期绝对),返回真
				f1 -ef f2:两个文件是否为同一个文件(硬连接),主要判断两个文件是否指向同一个inode号
			非:
				!:代表非,作用于选项前,有空格

				-s f:文件大小大于0时(非空),返回真


演示:
	#l 编写脚本
		[root@server ~]# mkdir /root/demo
		[root@server ~]# touch /root/demo/demo.txt
		[root@server ~]# ln -s demo.sh mode.sh
		[root@server ~]# vim test1.sh
			#!/bin/bash
			# 判断是否为软连接文件,是返回T
			if [ -L /root/mode.sh ]
			  then
			        echo "Ture"
			fi
			# 判断是否为普通文件,是返回T
			if [ -f /root/demo/demo.txt ]
			  then
			        echo "Ture"
			fi
			# 判断是否为目录,是返回T
			if [ -d /root/demo ]
			  then
			        echo "Ture"
			# 判断文件内容是否非空,加了!取反,是不返回T,由于取反就返回,所以返回T
			if [ ! -s /root/demo/demo.txt ]
			  then
			        echo "Ture"
			fi
	#l 运行脚本:
		[root@server ~]# sh test1.sh
			Ture
			Ture
			Ture
			Ture	

if 条件是字符串比较运算

判断输入的字符串是否和给定的字符串相等时,用于验证

if 条件是字符串比较运算说明:

命令格式:
	if [ 
				 –n 字符串   	 =>	字符串的长度不为空时,返回真
				 –z 字符串    	=>	字符串的长度为空时,返回真
			
				 字符串1=字符串2       =>	字符串是否相等,是返回真
				 字符串1!=字符串2      =>	字符串是否不等,不等返回真



#l 编写脚本:
	# vim string.sh
		[root@server ~]# vim string.sh
			#!/bin/bash
			# 指定用户账号密码
			init_account=root
			init_pw=123456
			# 交互式输入登录账号密码
			read -p "$HOSTNAME login:" account
			read -t5 -p "passwd:" pw
			# 判断用户输入账号为空时提示错误
			if [ -n "$account" ]
			     then
			# 判断用户账号输错时提示错误
			     if [ "$account" == "$init_account" ]
			         then
			# 判断用户密码输入为空时提示错误
			            if [ -n "$pw" ]
			               then
			# 判断用户密码输错时提示错误,只有输入正确的密码才能登录
			               if [ "$pw" == "$init_pw" ]
			                  then
			                       echo "欢迎回来:$account"
			
			               else
			                       echo "您输入的密码有误,请重新输入"
			                        sleep 5
			                        sh $0
			
			
			               fi
			
			
			             else
			                   echo "你输入的密码为空,请重新输入"
			                   sleep 5
			                   sh $0
			             fi
			
			
			     else
			           echo "您输入的用户名不可用,请重新输入"
			           sleep 5
			           sh $0
			     fi
			
			
			
			else
			        echo "您输入的用户名为空,请重新输入"
			        sleep 5
			        sh $0
			fi




运行脚本:
	# sh string.sh
		[root@server ~]# sh string.sh
			server login:
			passwd:
			您输入的用户名为空,请重新输入
	
			server login:12
			passwd:12
			您输入的用户名不可用,请重新输入
	
			server login:root
			passwd:
			你输入的密码为空,请重新输入
	
			server login:root
			passwd:112
			您输入的密码不可用,请重新输入
	
			server login:root		=>	输入正确账号密码退出脚本
			passwd:123456
			欢迎回来:root

if 条件是逻辑运算

if 语句可以执行逻辑运算,适用于多重条件判断时使用

逻辑运算符:与(&&)或(||)非(!)

  • 逻辑与:必须全部条件满足,表达式才判断为真

  • 逻辑或:至少有一个条件满足,表达式才判断为真

  • 逻辑非:条件为真时,表达式判断为假;条件为假时,表达式判断为真

if 条件是逻辑运算说明:

命令格式:
	# if [ condition1 选项 condition2 ]				# if [ condition1 ] 选项 [ cindition2 ] 
		选项说明:
			-a 和 && :表示逻辑与
			-o 和 || :表示逻辑或
			       ! :表示逻辑非,一般以"!="方式应用


演示:
	# if [ 1 -eq 1 -a 1 -ne 0 ]			=>	整个表示式为真
	# if [ 1 -eq 1] && [ 1 -ne 0]		=>	整个表示式为真

	# if [ 1 -eq 1 -a 1 -eq 0 ]			=>	整个表示式为真
	# if [ 1 -eq 1] || [ 1 -eq 0]		=>	整个表示式为真

编写脚本:

	# vim logic.sh
		[root@server ~]# vim logic.sh
			#!/bin/bash
			# 判断自己是否为躺平一族
			echo "只针对20~40进行判断,几岁写几岁,有无写1或0"
			read -p "你几岁:" get_age
			# 不允许谎报年龄者进行测试
			if [ $get_age -lt 20 ] || [ $get_age -gt 40 ]
			    then
			         echo "滚,$get_age 岁的你不能进行趟一族测试"
			         exit 1
			fi
			
			read -p "有女朋友没:" get_girlfriend
			read -p "有正经工作不:" get_jobs
			read -p "有房子不:" get_house
			read -p "有车子不:" get_car
			#  对20-30岁小朋友进行趟一族测试,判定条件全部都不满足才能说自己是趟一族
			if [ $get_age -ge 20 -a $get_age -lt 30 ]
			    then
			
			    if [ $get_girlfriend -eq 0 ] && [ $get_jobs -eq 0 ] && [ $get_house -eq 0 ] && [ $get_car -eq 0 ]
			        then
			           echo "test 20-30"
			            echo "恭喜您,$get_age 岁年纪轻轻就是趟一族普通帮众"
			            exit 1
			
			
			     else
			           echo "test 20-30"
			           echo "滚,$get_age 岁的你不是趟一族"
			           exit 1
			     fi
			# 对30-40岁小朋友进行趟一族测试,判定条件满足一个才能说自己是趟一族
			elif  [ $get_age -gt 30 ] && [ $get_age -le 40 ]
			      then
			
			       if [ $get_girlfriend -eq 1 ] || [ $get_jobs -eq 1 ] || [ $get_house -eq 1 ] || [ $get_car -eq 1 ]
			           then
			#               echo "test 30-40"
			                echo "恭喜您,$get_age 岁就成为趟一族的精英成员"
			                exit 1
			
			
			
			        else
			#                echo "test 30-40"
			                 echo "滚,$get_age 岁的你不是趟一族"
			              exit 1
			        fi
			fi

演示:

	# sh logic.sh
		[root@server ~]# sh logic.sh
			只针对20~40进行判断,几岁写几岁,有无写10
			你几岁:33
			有女朋友没:1
			有正经工作不:0
			有房子不:0
			有车子不:0
			恭喜您,33 岁就成为趟一族的精英成员
		[root@server ~]# sh logic.sh
			只针对20~40进行判断,几岁写几岁,有无写10
			你几岁:33
			有女朋友没:0
			有正经工作不:0
			有房子不:0
			有车子不:0
			滚,33 岁的你不是趟一族
		[root@server ~]# sh logic.sh
			只针对20~40进行判断,几岁写几岁,有无写10
			你几岁:22
			有女朋友没:1
			有正经工作不:0
			有房子不:0
			有车子不:0
			test 20-30
			滚,22 岁的你不是趟一族			

if 高级用法

if 使用双小圆括号:if (( 四则运算条件 ))

使用双小圆括号,可以在if条件中使用四则运算(只能做整型运算)

双小圆内变量可不带$、空格可随意有无

运算符的使用为: ><===>=<=!=

if 使用双小圆括号植入数学表达式说明:

命令格式:
	# if (( 四则运算表达式选项 ))
		选项说明:
			# if (( (5+5-5)*5/5 > 10 ))


编写脚本:
	# vim calculator.sh
		[root@server ~]# cat calculator.sh
			#!/bin/bash
			# if (()) 植入数学表达式
			if (( (2-2+2)*6/2+(2**2) > 25 ))
			then
			echo "yes"
						
			else
			echo "no"
			fi

	   
运行代码:
	# sh calculator.sh
		[root@server ~]# sh calculator.sh
			no	

if 使用双方括号:if [[ 字符串条件 ]]

使用双方括号,条件对象是字符串(可以使用通配符)

使用通配符时,不需要加引号,否则代表字符串

为字符串提供正则

if 使用双方括号说明:

命令格式:
	# if [[ 选项 ]]
		选项说明:
			# if [[ "$i" == a* ]]		=>	注意不要加引号,加引号*表示字符串了,不再为通配符
			

编写脚本:
	# vim string.sh
		[root@server ~]# vim string.sh	
			#!/bin/bash
			# 定义字符串
			for i in aaa aab abc  ccd
			   do
			      if [[ "$i" == a* ]]
			         then
			              echo "$i"
			
			      fi
			done


运行脚本:
	# sh string.sh
		[root@server ~]# sh string.sh
			aaa
			aab
			abc

if 语句简写

  • 当代码块command为单行代码时可以简写

单if 语句简写格式:

  • 在脚本中可以简写:
if语句简写:
	[ condition ] && command
		=>	&& 替代 then

if..else语句简写:
	[ condition ] && command||command
		=>	|| 替代 else

编写脚本:

简写第一种:
	# vim  if_simple.sh
		[root@server ~]# vim  if_simple.sh
			#!/bin/base
			# 单if语句简写,&& 替代 then
			# 判断文件是否存在,不存在返回no
			[ ! -e /bin/albb ] && echo "no"
			
			
			# if..else语句简写,&& 替代then、|| 替代 else
			# 判断文件是否存在,存在返回yes,不存在返回no
			[ -e /etc/passwd ] && echo "yes" || echo "no"

运行脚本:

# sh if_simple.sh
	[root@server ~]# sh if_simple.sh
		no
		yes

以上是关于if 判断语句与shell运算的主要内容,如果未能解决你的问题,请参考以下文章

Shell-条件测试和判断语句

Shell-条件测试和判断语句

shell if判断语句

Linux | shell脚本-条件判断if和循环语句for

Linux实操篇—— Shell 编程入门变量运算符条件判断流程控制

Linux实操篇—— Shell 编程入门变量运算符条件判断流程控制