流程控制

if

单分支结构

if 条件测试
then 命令序列
fi

双分支结构

if 条件测试
then 命令序列
else 命令序列
fi

多分支结构

if 条件测试 1
then 命令序列
[elif 条件测试 2
then 命令序列
elif 条件测试 3
then 命令序列]...
else 命令序列
fi

示例说明

例1

安装httpd脚本(初始版本):判断网络是否正常,正常就安装,异常就直接退出

[root@hadoop04 shell_if]# vim install_apache01.sh
#!/usr/bin/bash
##########################################
# install apache #
# v1.0 by ElegantSmile 8/12/2019 #
########################################## ping -c1 www.baidu.com &> /dev/nul if [ $? -ne 0 ];then
echo "connect: unreachable"
exit
fi yum -y install httpd systemctl start httpd systemctl enable httpd firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config setenforce 0

例2

安装httpd脚本(改进版):判断网络是否正常,正常就安装,异常就先判断是否可以测通网关,否则提示检查IP地址

[root@hadoop04 shell_if]# vim install_apache02.sh
#!/usr/bin/bash
##########################################
# install apache #
# v1.1 by ElegantSmile 8/12/2019 #
########################################## gateway=172.22.34.1 ping -c1 www.baidu.com &> /dev/nul if [ $? -eq 0 ];then
yum -y install httpd
systemctl start httpd
systemctl enable httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
setenforce 0 curl http://127.0.0.1 &> /dev/null
if [ $? -eq 0 ];then
echo "Apache ok..."
fi
elif ping -c1 ${gateway} &> /dev/null
echo "check dns..."
else
echo "check ip address!"
fi

例3

read -p "确认开始安装 KVM [y]: " kvm_install
if [ ! "${kvm_install}" = "y" ];then
echo -e "$red_col 输入不正确! $reset_col"
exit
fi

例4

配置yum源脚本

阿里云yum配置帮助:https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.53322f70C917rC

阿里云镜像仓库:https://developer.aliyun.com/mirror

#!/usr/bin/bash
##########################################
# yum config #
# v1.0 by ElegantSmile 8/12/2019 #
########################################## yum_server=10.18.40.100
os_version=`cat /etc/redhat-release | awk '{print $(NF-1)}' | awk -F "." '{print $1}'` # 备份yum源文件方式1
# [ -d /etc/yum.repos.d/bak ] || mkdir /etc/yum.repos.d/bak
#mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ # 备份yum源文件方式2
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 7纯属测试本地yum源,建议使用6和8的方式下载阿里云的yum源文件
if [ "${os_version}" = "7" ];then
cat > /etc/yum.repos.d/centos7u6.repo
[centos7u6]
name=centos7u6
baseurl=ftp://$yum_server/centos7u6
gpkcheck=0
EOF
# 建议做法: curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 6和8下载阿里云的yum源文件
elif [ "${os_version}" = "6" ];then
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
elif [ "${os_version}" = "8" ];then
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
fi

例5

检查某软件包是否已经安装

#!/usr/bin/bash
##########################################
# check vsftpd install #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## # 可以通过$1传参
# rpm_name=$1
rpm_name=vsftpd # 检查安装包是否已经安装
rpm -qa | grep ${rpm_name} # 已经安装的话,提示已经安装
if [ $? -eq 0 ];then
echo "${rpm_name} is installed."
# 未安装的话,可以提示未安装,也可以执行安装操作
else
echo "${rpm_name} is not installed."
fi

case

语法结构

case 变量 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
模式 3)
命令序列 3
;;
*)
无匹配后命令序列
esac

示例说明

例1

配置yum源脚本

[root@hadoop04 shell_case]# vim yum_config.sh
#!/usr/bin/bash
##########################################
# yum config #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## os_version=`cat /etc/redhat-release | awk '{print $(NF-1)}' | awk -F "." '{print $1}'` # 备份yum源文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup &> /dev/null && echo "CentOS-Base.repo backup done" # 下载阿里云的yum源文件
case "${os_version}" in
"8")
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
echo "yum configure done"
;;
"7")
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
echo "yum configure done"
;;
"6")
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
echo "yum configure done"
;;
"*")
echo "error"
esac # if 结构的yum配置
#if [ "${os_version}" = "7" ];then
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#elif [ "${os_version}" = "6" ];then
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
#elif [ "${os_version}" = "8" ];then
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
#fi

例2

删除用户脚本:判断用户是否存在,如果存在,询问是否确认删除

[root@hadoop04 shell_case]# cat del_user.sh
#!/usr/bin/bash
##########################################
# yum config #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## red_col="\e[31m"
green_col="\e[32m"
reset_col="\e[0m" read -p "Please input a username: " username id ${username} &> /dev/null if [ $? -ne 0 ];then
echo -e "user ${red_col}${username}${reset_col} not exists."
exit 1
fi read -p "Are you sure?[y/n]: " action
case "${action}" in
y|Y|yes|YES)
userdel -r ${username}
echo -e "user ${green_col}${username}${reset_col} is deleted."
;;
*)
echo "error"
esac

例3

系统管理工具箱(初始版本)

[root@hadoop04 shell_case]# vim system_manage01.sh
#!/usr/bin/bash
##########################################
# system manage #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## red_col="\e[31m"
green_col="\e[32m"
reset_col="\e[0m"
blue_col="\e[34m" menu() {
cat <<-EOF
##########系统管理工具箱#############
# Command action #
# h 显示命令帮助 #
# f 显示磁盘分区 #
# d 显示磁盘挂载 #
# m 查看内存使用 #
# u 查看系统负载 #
# q 退出程序 #
#####################################
EOF
} menu echo -e "${blue_col}command (h for help):${reset_col} \c" read action #echo "Your choice is ${choice}" case "${action}" in
"h")
clear
menu
;;
"f")
fdisk -l
;;
"d")
df -Th
;;
"m")
free -m
;;
"u")
uptime | awk -F ", " '{print $NF}'
;;
"q")
#exit
break
;;
*)
echo "error input"
;;
esac

例4

系统管理工具(优化版):增加循环,不会输入一次选项就直接退出,输入q才会退出;输入空白跟输入错误的提示不同

[root@hadoop04 shell_case]# vim system_manage02.sh
#!/usr/bin/bash
##########################################
# system manage #
# v1.1 by ElegantSmile 9/12/2019 #
########################################## red_col="\e[31m"
green_col="\e[32m"
reset_col="\e[0m"
blue_col="\e[34m" menu() {
cat <<-EOF
##########系统管理工具箱#############
# Command action #
# h 显示命令帮助 #
# f 显示磁盘分区 #
# d 显示磁盘挂载 #
# m 查看内存使用 #
# u 查看系统负载 #
# q 退出程序 #
#####################################
EOF
} menu # while :循环,相当于 while true:
while :
do echo -e "${blue_col}command (h for help):${reset_col} \c" read action #echo "Your choice is ${choice}" case "${action}" in
"h")
clear
menu
;;
"f")
fdisk -l
;;
"d")
df -Th
;;
"m")
free -m
;;
"u")
uptime | awk -F ", " '{print $NF}'
;;
"q")
#exit
break
;;
"")
;;
*)
echo "error input"
;;
esac done

简单的 JumpServer

虚拟机准备

jumpserver 172.22.34.20

client server1 172.22.34.16

client server2 172.22.34.15

client server配置

创建alice用户,并设置密码

[root@hadoop00 ~]# useradd alice
[root@hadoop00 ~]# passwd alice

jump server配置

编写jumpserver.sh脚本
[root@hadoop04 shell_case]# cat jump_server.sh
#!/usr/bin/bash
##########################################
# jump server #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## reset_col="\e[0m"
blue_col="\e[34m"
red_col="\e[31m" # 捕捉到相应的键盘信号,不做任何操作
trap "" HUP INT OUIT TSTP web1=172.22.34.16
web2=172.22.34.17
mysql1=172.22.34.18 clear while :
do
cat <<-EOF
+------------------------------------------------+
| Jump server |
| 1.web1 |
| 2.web2 |
| 3.mysql1 |
+------------------------------------------------+
EOF
# 文字显示颜色,并且不换行,有两种实现方式
# -e \c
# -en
# echo -e "${blue_col}请选择要连接的主机[1-3]:${reset_col} \c"
echo -en "${blue_col}请选择要连接的主机[1-3]:${reset_col}" read action case "${action}" in
"1")
ssh alice@${web1}
;;
"2")
ssh alice@${web2}
;;
"3")
ssh alice@${mysql1}
;;
"")
;;
*)
echo -e "${red_col}error input${reset_col}"
;;
esac
done
创建用户alice
[root@hadoop04 ~]# useradd alice
[root@hadoop04 ~]# passwd alice
# 将jumpserver.sh拷贝到alice的家目录
生成密钥
# 切换到alice用户
[root@hadoop04 ~]# su - alice [alice@hadoop04 ~]$ ssh-keygen
Generating public/private rsa key pair. Enter file in which to save the key (/home/alice/.ssh/id_rsa): Created directory '/home/alice/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alice/.ssh/id_rsa.
Your public key has been saved in /home/alice/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TiwMdEGhaYU3zv3N9b8aNHBglFr9Wh9i4Rj6tyT7e/U alice@hadoop04
The key's randomart image is:
+---[RSA 2048]----+
| .o*o .+o |
| ..=o .+.o |
| =+ o +.+.o |
| . oo..o .o+.+ |
| o S..o.++.o|
| + .o++. +|
| . =.. +|
| . ...E|
| .++..|
+----[SHA256]-----+
拷贝密钥
[alice@hadoop04 ~]$ ssh-copy-id 172.22.34.16

[alice@hadoop04 ~]$ ssh-copy-id 172.22.34.17

[alice@hadoop04 ~]$ ssh-copy-id 172.22.34.18
配置执行脚本

切换到alice用户,配置.bashrc文件

[alice@hadoop04 ~]$ vim ~/.bashrc

/bin/bash /home/alice/jump_server.sh
实际效果

登录到alice用户

只能输入数字1-3,Ctrl+C之类的命令无效,无法退出,也就说只能通过这台机器跳转到其他机器,无法在该机器上进行其他操作

04Shell流程控制的更多相关文章

  1. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...

  2. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  3. PHP基础知识之流程控制的替代语法

    PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch. 替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,e ...

  4. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # - ...

  5. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  6. [Java入门笔记] Java语言基础(四):流程控制

    流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下几种: 顺序结构 顺序结构,顾名思义,是指程序从上往下逐步顺序执行.中间没有任何的判断和跳转. 分支结构 Java提供两种分支结构: ...

  7. node基础13:异步流程控制

    1.流程控制 因为在node中大部分的api都是异步的,比如说读取文件,如果采用回调函数的形式,很容易造成地狱回调,代码非常不容易进行维护. 因此,为了解决这个问题,有大神写了async这个中间件.极 ...

  8. Shell入门教程:流程控制(1)命令的结束状态

    在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...

  9. Oracle中PL/SQL的执行部分和各种流程控制

    Oracle中PL/SQL的执行部分和异常部分 一.PL/SQL的执行部分. 赋值语句. 赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值:另一种是通过SQL查询结果赋值. 用户赋值举例: ...

随机推荐

  1. 前端与算法 leetcode 7. 整数反转

    目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...

  2. 力扣(LeetCode)第一个错误的版本 个人题解

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  3. 领扣(LeetCode)删除链表中的节点 个人题解

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...

  4. Arduino驱动ILI9341彩屏(一)——颜色问题

    最近在淘宝的店铺上淘到了一块ILI9341的彩色液晶屏,打算研究一下如何使用. 淘宝店铺购买屏幕之后有附源代码可供下载,代码质量惨不忍睹,各种缩进不规范就不说了,先拿来试一下吧. 这是淘宝店铺代码的核 ...

  5. python描述:链表

    单链表结构: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点 ...

  6. flexpaper跨服务器访问swf不显示问题

    在项目中使用flexpaper.html在线预览时,发现文件存放在本地localhost能访问,在服务器上的无法访问,通常报错“loadswf() is not defined” 研究发现是跨域问题导 ...

  7. 20191107-7 beta week 2/2 Scrum立会报告+燃尽图 06

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9959 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  8. Linux LVM 配置

    本文出自 “www.kisspuppet.com” 博客,请务必保留此出处http://dreamfire.blog.51cto.com/418026/1084729 许多Linux使用者安装操作系统 ...

  9. css控制ul标签下的指定li标签样式

    ul li:first-child{ }  第一个ul li:last-child{ }   最后一个ul li:nth-child(4){ } 指定第几个,4就是代表第四个ul li:nth-chi ...

  10. 解决Debina系统自动更新软件包的问题

    不知从何时开始,我的电脑每天开机连接上网络之后,不断的在下载数据,状态栏显示网速达到每秒1到2兆.开始我还不太在意,不过后来由于带宽全部被这种莫名其奥妙的下载占据了,我连网页都无否正常浏览了,所以我决 ...