云计算教程之Shell编程分支控制语句

举报
tea_year 发表于 2024/08/17 10:41:08 2024/08/17
【摘要】 课程目标熟悉流程控制语句基本语法,如if…else… Shell编程在自动化任务、系统管理和数据处理方面具有显著优势。它可以用来编写脚本,执行重复任务,如文件备份,系统配置,如软件安装,以及数据分析,如计算文件统计信息。对于系统管理员、开发人员和数据分析师,掌握Shell编程能提升效率。 一、流程控制语句1. 基本语法结构F: false 假T: true 真 if [ condition ...

课程目标

  • 熟悉流程控制语句基本语法,如if…else…

 Shell编程在自动化任务、系统管理和数据处理方面具有显著优势。它可以用来编写脚本,执行重复任务,如文件备份,系统配置,如软件安装,以及数据分析,如计算文件统计信息。对于系统管理员、开发人员和数据分析师,掌握Shell编程能提升效率。 


一、流程控制语句

1. 基本语法结构

F: false 假

T: true 真

 if [ condition ];then
         command
         command
 fi
 ​
 [ 条件 ] && command



 if [ condition ];then
         command1
     else
         command2
 fi
 ​
 [ 条件 ] && command1 || command2

 if [ condition1 ];then
         command1  结束
     elif [ condition2 ];then
         command2   结束
     else
         command3
 fi
 注释:
 如果条件1满足,执行命令1后结束;如果条件1不满足,再看条件2,如果条件2满足执行命令2后结束;如果条件1和条件2都不满足执行命令3结束.

 if [ condition1 ];then
         command1        
         if [ condition2 ];then
             command2
         fi
     else
         if [ condition3 ];then
             command3
         elif [ condition4 ];then
             command4
         else
             command5
         fi
 fi
 注释:
 如果条件1满足,执行命令1;如果条件2也满足执行命令2,如果不满足就只执行命令1结束;
 如果条件1不满足,不看条件2;直接看条件3,如果条件3满足执行命令3;如果不满足则看条件4,如果条件4满足执行命令4;否则执行命令5


2. 应用案例

需求1:判断当前主机是否和远程主机是否ping通

 思路:
 1. 使用哪个命令实现 ping -c
 2. 根据命令的执行结果状态来判断是否通        $?
 3. 根据逻辑和语法结构来编写脚本(条件判断或者流程控制)
 步骤:
 vim ping.sh
 #!/bin/bash
 # Name:ping.sh
 # Path:/shell02/
 # Usage:/shell02/ping.sh
 # ...
 ​
 #获取远程主机的IP地址(定义变量让用户自己输入)
 read -p "请输入你要ping的远程主机IP:" IP
 #使用ping命令来判断是否和远程主机互通
 ping -c1 $IP &>/dev/null
 if [ $? -eq 0 ];then
     echo "当前主机和远程主机$IP是互通的。"    
 else
     echo "当前主机和远程主机$IP是不通的。"
 fi
 或者
 ​
 #!/bin/bash
 # Name:ping.sh
 # Path:/shell02/
 # Usage:/shell02/ping.sh
 # ...
 ​
 #使用ping命令来判断是否和远程主机互通
 if [ $# -ne 1 ];then
         echo "Usage:$0 remote_ip" && exit
 ​
 fi
 或者
 [ $# -ne 1 ] && echo "Usage:$0 remote_ip" && exit
 ​
 ping -c1 $1 &>/dev/null
 [ $? -eq 0 ] && echo "当前主机和远程主机$1是互通的。" ||echo "当前主机和远程主机$1是不通的。"
 ​
 说明:exit直接退出程序

需求2:判断一个进程是否存在

 思路:
 1.查看进程的相关命令 ps -ef  pgrep  ps auxf pidof
 2.根据命令的返回状态值来判断进程是否存在  $?
 3.根据逻辑用脚本语言实现
 ​
 #!/bin/bash
 # Name:process.sh
 # Path:/shell02/
 # Usage:/shell02/process.sh
 # Describe:判断一个进程是否存在
 ​
 # 定义变量
 read -p "请输入需要判断的进程名(httpd):" process
 # 通过命令来查看进程是否存在
 pgrep $process &>/dev/null
 # 通过命令执行的状态来判断是否存在
 if [ $? -eq 0 ];then
     echo "进程$process存在"
 else
     echo "进程$process不存在"
 fi
 或者
 [ $? -eq 0 ] && echo "进程$process存在" || echo "进程$process不存在"
 ​
 ​
 pgrep命令:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id
 选项
 -o:仅显示找到的最小(起始)进程号;
 -n:仅显示找到的最大(结束)进程号;
 -l:显示进程名称;
 -P:指定父进程号;pgrep -p 4764  查看父进程下的子进程id
 -g:指定进程组;
 -t:指定开启进程的终端;
 -u:指定进程的有效用户ID。

需求3:判断一个服务是否正常(以httpd为例):

思路:

  1. 可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法

  2. 最好的方法是直接去访问一下,通过访问成功和失败的返回值来判断

 ​
 #!/bin/bash
 wget http://10.1.1.2 &>/dev/null
 [ $? -eq 0 ] && echo "该web服务是正常的" && rm -f /shell/shell01/index.* || echo "该web服务异常请检查"
 ​
 ​

3. 课堂练习

1、输入一个用户,用脚本判断该用户是否存在

 read -p "请输入需要判断的用户名:" user
 id $user &>/dev/null
 test $? -eq 0 && echo "该$user存在" || echo "该$user不存在"

2、判断vsftpd软件包是否安装,如果没有则自动安装(yum源已配好)

 #!/bin/bash
 rpm -q vsftpd &> /dev/null
 if [ $? -eq 0 ];then
         echo "vsftpd已经安装"
 else
         echo "该软件包没有安装,正在安装...."
         yum install -y vsftpd &> /dev/null
 ​
         if [ $? -eq 0 ];then
                 echo "vsftpd安装成功"
         else
                 echo "vsftpd安装失败"
         fi
 fi
 ​
 ​
 ​

3、判断当前内核主版本是否为2,且次版本是否大于等于6;如果都满足则输出当前内核版本

 思路:
 1. 先查看内核的版本号    uname -r
 2. 先将内核的版本号保存到一个变量里,然后再根据需求截取出该变量的一部分:主版本和次版本
 3. 根据需求进步判断
 ​
 ​
 #!/bin/bash
 kernel=`uname -r`
 var1=`echo $kernel|cut -d. -f1`
 var2=`echo $kernel|cut -d. -f2`
 test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
 或者
 [ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "当前内核版本不符合要求"
 或者
 [[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "当前内核版本不符合要求"
 ​
 或者
 #!/bin/bash
 kernel=`uname -r`
 test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo '不符合要求'
 ​
 其他命令参考:
 uname -r|grep ^2.[6-9] || echo '不符合要求'
 ​

4、判断ftp服务是否已启动,如果已启动输出以下信息:

vsftpd服务器已启动... vsftpd监听的端口是: vsftpd的进程PID是:

 参考1:
 #!/bin/bash
 service vsftpd status &>/dev/null
 if [ $? -eq 0 ];then
     port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
     pid=`pgrep -l vsftpd|cut -d ' ' -f1`
     echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
 else
     service vsftpd start &>/dev/null
     port=`netstat -tnltp|grep vsftpd|cut -d: -f2|cut -d' ' -f1`
    pid=`pgrep -l vsftpd|cut -d ' ' -f1`
    echo -e "vsftpd服务器已启动...\nvsftpd监听的端口是:$port\nvsftpd的进程PID是:$pid"
 fi
 ​
 ​
 参考2:
 [root@server shell02]# cat liufeng.sh 
 #!/bin/bash
 service $1 status
 if [ $? -eq 0 ];then
         echo " '$1'服务器已启动..."
         a=$( netstat -tnulp | grep $1 )
         array=($a)
         echo "$1的监听端口是:$(echo ${array[3]} | cut -d: -f2) "
         echo "$1的进程ID为:$(echo ${array[6]}| cut -d/ -f1)"
 else
         echo "$1进程未启动!"
 fi
 ​
 参考3:
 vim /lt/2.sh
 #! /bin/bash
 duankou=`netstat -ntlp|grep vsftpd|cut -d: -f2|cut -d" " -f1`
 pid=`pgrep -o vsftpd`
 ​
 vim 1.sh
 pgrep -l vsftpd >/dev/null
 if [ $? -eq 0 ];then
         echo "vsftpd服务器已启动..."
         echo "vsftpd监听的端口是:$duankou"
         echo "vsftpd的进程PID是:$pid"
 else
         echo "vsftpd服务器没启动"
         service vsftpd start
         source /lt/2.sh
 fi
 ​


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。