【Shell 脚本速成】07、Shell 流程控制——if 判断语句

导读:本篇文章讲解 【Shell 脚本速成】07、Shell 流程控制——if 判断语句,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

一、if 介绍

二、单 if 语法

三、if…else 语句

四、if…elif…else

五、if 嵌套 if

5.1 使用 if 嵌套 if 的方式判断两个整数的关系

5.2 写一个nginx安装初始化脚本 

六、if 语句与 shell 运算 

6.1 与文件存在与否的判断

6.2 文件权限相关的判断

6.3 整数之间的判断

6.4 字符串之间的判断

6.5 多重条件判断

七、if 高级用法 

7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

7.2 使用双方括号,可以在条件中使用通配符

八、简写 if 


 

一、if 介绍

如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。

比如nginx安装脚本中

  • configure执行成功在执行make,
  • make执行成功在执行make install
  • 上一步错误就不需要执行后面的代码了。

answer: 加入判断

只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。

        当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。

二、单 if 语法

适用范围:只需要一步判断,条件返回真则执行下一步操作。

语句格式

if [ condition ]           # condition 值为true or false。[] 两边需要空格
   then                    # 条件为真的时候执行
      commands             # 代码块。一行或者多行代码
fi			               # 语句的结束

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

        下面通过一段代码来演示一下吧,判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!”

[root@shell ~]# vim /tmp/if-1.sh
#!/bin/bash

if [ $USER != 'root' ]
   then
	echo "ERROR: need to be root so that!"
	exit 1
fi

[root@shell ~]# chmod 755 /tmp/if-1.sh
[root@shell ~]# sh /tmp/if-1.sh ; echo $?
0
[root@shell ~]# echo $USER
root

# 切换用户
[root@shell ~]# su - harry 
上一次登录:二 11月 29 18:22:56 CST 2022pts/0 上
[harry@shell ~]$ sh /tmp/if-1.sh 
ERROR: need to be root so that!
[harry@shell ~]$ echo $?
1
[harry@shell ~]$ exit
登出

三、if…else 语句

适用范围:两步判断,条件为真执行操作,条件为假则执行另一个操作。

if [ condition ]        # 条件判断 
     then           	# 条件为真
          commands1     	# 真  要执行代码块
else                	# 条件为假
          commands2     	# 假   要执行的代码块
fi         		        # 结束

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

        通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出“hey admin”; 如果是普通用户输出“hey guest”:

[root@shell tmp]# vim if-2.sh
#!/bin/bash

if [ $USER == 'root' ]
then
        echo "hey admin"
else
        echo "hi guest"
fi

[root@shell tmp]# whoami 
root
[root@shell tmp]# sh if-2.sh 
hey admin

[root@shell tmp]# su - harry -c "sh /tmp/if-2.sh"
hi guest

四、if…elif…else

适用范围:两个以上的判断结果,也就是多于一个以上的判断条件。

if [ condition 1]       满足第一个条件

     then          真

            command1    执行 command1 代码块
elif [ condition 2]     满足第二个条件
 
     then           真

             commands2  执行 command2 代码块

  .......
else         如果条件都不满足

            commandsX    执行 commandX 代码块
fi    结束判断

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系

案例需求
判断内存的使用率

  • 60以下 ok
  • 60以上 黄色警告
  • 70以上 橙色严重警告
  • 80以上 红色警告

案例思考

内存使用率获得方式

  • 手动给出
  • 通过内存查看命令运算得出

案例代码

[root@shell tmp]# vim if-3.sh
#!/bin/bash
#1、条件
#判断内存的使用率
#60以下    ok 绿色  32m
#60以上    黄色警告   33m
#70以上    粉色严重警告 35m 
#80以上    红色警告 31m

#2、算法
#收集内存使用率  $1 # 脚本外传参
#
#多条件判断

if [ $1 -gt 80 ]
then
	echo -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
then
	echo -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
then
	echo -e "\033[33m 警告 \033[0m"
else
	echo -e "\033[32m OK \033[0m"
fi


# 注意事项:
如果多条件判断存在包含的关系,需要从最严格开始判断;否则,后面的就不会生效
如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70  80 就没有任何意义

效果展示

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

关于脚本外传参:shell 内置变量

  • 本程序的名字: $0
  • 本程序执行进程号是:$$
  • 上条命令执行结果是:$?
  • 传入参数的数量是:$#
  • 传入的第2个参数是:$2
  • 传入的参数列表:$@

脚本外传参的执行方法:脚本名字 参数1 参数2 …(如上面的脚本执行方式)

脚本内部调用的方法 :$1 $2 … $N

特点:减少用户交互

五、if 嵌套 if

当有多步判断的时候,可以使用if嵌套

  1. 多步判断。类似于多条件if
  2. 依赖执行的环境 configure -> make-> make install

5.1 使用 if 嵌套 if 的方式判断两个整数的关系

#!/bin/bash

if [ $1 -eq $2 ];then
        echo "$1 = $2"
else
        if [ $1 -gt $2 ];then
                echo "$1 > $2"
        else
                echo "$1 < $2"
        fi
fi

 效果展示

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

5.2 写一个nginx安装初始化脚本 

案例需求
写一个nginx业务初始化脚本,完成nginx软件自动安装。

案例思考

  1. nginx软件包获得方式
  2. nginx安装流程
  3. nginx安装依赖关系

案例步骤

  1. 软件包下载
  2. 软件包解压
  3. 安装依赖包
  4. 安装nginx
  5. 返回结果

案例代码

[root@shell tmp]# vim nginx_install.sh
#!/bin/bash

source_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg 
#2、解压
if [ -f $source_pkg ];then
	tar xf $source_pkg && cd nginx-1.19.2
else
        echo "not found $source_pkg"
	exit 1
fi

#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );then
      echo "yum: install soft error"
      exit 1
fi

#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null        
	then
	#判断make执行结果
	     if make 1>/dev/null
		 then
		 #判断make install安装结果
			if make install 1>/dev/null
			   then
			 	echo "nginx 安装成功"
			else
			 	echo "nginx 安装失败"
				exit 1
		        fi
		else
			echo "make fail"
			exit 1
		fi
else
		echo "configure fail"
		exit 1
fi



#./configure 等价于 if [ $? -eq 0 ];then

#注意: 1>/dev/null
1  为标准输出
2  为标准错误输出

六、if 语句与 shell 运算 

6.1 与文件存在与否的判断

-e	是否存在   不管是文件还是目录,只要存在,条件就成立
-f	是否为普通文件
-d	是否为目录
-S	socket
-p	pipe
-c	character
-b	block
-L	软link

案例演示

# 判断/tmp/test目录,如果没有则创建它
[root@shell tmp]# vim if-5.sh
#!/bin/bash

if [ ! -d /tmp/test ];then
	mkdir -pv /tmp/test
fi

[root@shell tmp]# sh if-5.sh 
mkdir: 已创建目录 "/tmp/test"
[root@shell tmp]# ls

6.2 文件权限相关的判断

-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位

 案例演示:

[root@shell tmp]# vim if-6.sh
#!/bin/bash

if [ -x /tmp/test/linux ];then
        /tmp/test/linux
else
        echo "ERROR: no exec"
fi

# 没有文件报错
[root@shell tmp]# sh if-6.sh 
ERROR: no exec
[root@shell tmp]# echo "echo hahha" > /tmp/test/linux

# 没有执行权限报错
[root@shell tmp]# sh if-6.sh 
ERROR: no exec
[root@shell tmp]# chmod 755 /tmp/test/linux 
[root@shell tmp]# sh if-6.sh 
hahha

6.3 整数之间的判断

-eq	    相等
-ne	    不等
-gt	    大于
-lt	    小于
-ge     大于等于
-le	    小于等于


浮点比较运算
比较两个浮点数字的大小
给脚本两个浮点数字   返回他两的关系


#思路
1、获得两个浮点数字
2、处理为整形
3、比较
4、输出

# 案例演示:
#!/bin/bash
#1. 交互或者外传参的方式获得两个整数
#$1 $2
[ $# -lt 2 ]&&echo "need two args" && exit 1

#2. 采用外传参的方式接收数据并放大 100倍,并处理为整数
num1=`echo "scale=2;$1*100" | bc | cut -d "." -f1`
num2=`echo "scale=2;$2*100" | bc | cut -d "." -f1`

#3. 比较运算
if [ $num1 -gt $num2 ];then
    #3、输出结果
    echo "$1 > $2"
elif [ $num1 -lt $num2 ];then
    echo "$1 < $2"
else
    echo "$1 = $2"
fi

6.4 字符串之间的判断

-z                      是否为空字符串       字符串长度为0,就成立
-n                      是否为非空字符串    	只要字符串非空,就是成立
string1 == string2 		是否相等
string1 != string2 		不等

案例演示:

[root@shell tmp]# vim if-7.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
        echo "用户名为空!"
        exit 1
fi

# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
        # 判断用户名
        if [ $myuser == "root" ];then
           # 判断密码
           if [ $mypw == "root" ];then
                   echo "welcome root~"
           else
                   echo "密码错误!"
                   exit 1
           fi
        
        else
         echo "用户名错误!"
                exit 1
        fi              

else
        echo "密码不能为空!"
        exit 1
fi

效果展示:

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

6.5 多重条件判断

# 逻辑判断符号:
&&  	(and 逻辑与) 		两个条件同时满足,整个大条件为真
||	    (or 逻辑或)		    两个条件满足任意一个,整个大条件为真
! 	    非运算

案例演示:

[root@shell tmp]# vim if-8.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
        echo "用户名为空!"
        exit 1
fi

# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
        if [ $myuser == 'root' ] && [ $mypw == 'abc-123' ];then
                echo "welcome root"
        else
                echo "用户名或密码错误"
                exit 1
        fi

else
        echo "密码不能为空"
        exit 1
fi

效果展示:

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

七、if 高级用法 

7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

[root@shell tmp]# vim if-9.sh 
#!/bin/bash

if (( (5+5-5)*5/5 > 10 ))
    then
        echo "yes"
else
        echo "no"
fi

[root@shell tmp]# sh if-9.sh 
no

7.2 使用双方括号,可以在条件中使用通配符

通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配 r 开头的字符串:

[root@shell tmp]# vim if-10.sh
#!/bin/bash

for var in  ab ac rx bx rvv vt
   do
       if [[ "$var" == r* ]]
          then
                echo "$var"
       fi
done

[root@shell tmp]# sh if-10.sh 
rx
rvv

八、简写 if 

省去了关键字,条件为真采用 && 符号链接命令块,条件为假采用 || 链接命令块。简写 if 一般用在简单的判断中。

# 案例一
if [ ! -d /tmp/baism ]
    then
        mkdir /tmp/baism
fi

# 可以简写为:
[ ! -d /tmp/baism ] && mkdir /tmp/baism

# 案例二
if [ $USER == 'root' ]
	  then
	      echo "hello root"
else
			  echo "hello guest"
fi

# 可以简写为:
[ $USER == 'root' ] && echo "hello root" || echo "hello guest"


注:把 then 替换为 &&
把 else 替换为 ||

上一篇文章:【Shell 脚本速成】06、Shell 数组详解_Stars.Sky的博客-CSDN博客

参考文档:shell流程控制-if判断语句-组团学

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74557.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!