云计算教程之Shell编程分支控制语句
【摘要】 课程目标熟悉流程控制语句基本语法,如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为例):
思路:
-
可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法
-
最好的方法是直接去访问一下,通过访问成功和失败的返回值来判断
#!/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)