一、For循环基本概述
1.语法格式
for 变量名 in 取值列表 do 循环体 done
当条件为真时,执行循环体,当条件为假时,循环体结束
2.for循环基本使用示例
[root@xian /server/scripts]# cat for-1.sh
#!/bin/bash
# File Name: for-1.sh
# Author: lixian
#######################
for i in 1 2 3
do
echo "$i"
done
[root@xian /server/scripts]# sh for-1.sh
1
2
3
3.取值列表
默认取值 in后面的就是取值的内容 默认是以空白字符为分割符 空格 tab键 回车键都属于空白字符
取值列表中出现特殊字符,需要进行转义
4.自定义Shell分隔符
默认情况以空格为分隔符。通过IFS来自定义分隔符
#以冒号做分隔符 IFS=:
#以冒号,分号和双引号作为字段分隔符 IFS=:;”
#以换行符作为字段分隔符 IFS=$’\n’
以回车为分隔符示例
[root@xian /server/scripts]# cat for-1.sh
#!/bin/bash
# File Name: for-1.sh
# Author: lixian
#######################
IFS=$'\n'
for i in `cat /etc/hosts`
do
echo "$i"
done
[root@xian /server/scripts]# sh for-1.sh
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
定义多个分隔符(以冒号和空格为分隔符)示例
[root@xian /server/scripts]# cat test.txt root:x:0:0 root:/root /bin/bash [root@xian /server/scripts]# sh for-1.sh root x 0 0 root /root /bin/bash
二、 For循环C语言风格
1.语法格式
for ((i=0;i<10;i++))
do
commands
done
2.c语言风格for循环示例
[root@xian /server/scripts]# cat c_for.sh
#!/bin/bash
# File Name: c_for.sh
# Author: lixian
#######################
for ((i=0,j=9;i<10;i++,j--))
do
echo "$i + $j = $(($i+$j))"
done
[root@xian /server/scripts]# sh c_for.sh
0 + 9 = 9
1 + 8 = 9
2 + 7 = 9
3 + 6 = 9
4 + 5 = 9
5 + 4 = 9
6 + 3 = 9
7 + 2 = 9
8 + 1 = 9
9 + 0 = 9
3.shell风格for循环示例
[root@xian /server/scripts]# cat for_for.sh
#!/bin/bash
# File Name: for_for.sh
# Author: lixian
#######################
a=0
b=9
for i in {1..10}
do
echo "$a + $b = $(($a+$b))"
let a++
let b--
done
[root@xian /server/scripts]# sh for_for.sh
0 + 9 = 9
1 + 8 = 9
2 + 7 = 9
3 + 6 = 9
4 + 5 = 9
5 + 4 = 9
6 + 3 = 9
7 + 2 = 9
8 + 1 = 9
9 + 0 = 9
三、通过读入文件的方式进行创建用户
1.需要创建用户的文件列表
[root@xian /server/scripts]# cat useradd.txt lx1 lx2 lx3 lx4 lx5
2.脚本代码
[root@xian /server/scripts]# cat for_useradd_lixian.txt.sh
#!/bin/bash
# File Name: for_useradd.sh
# Author: lixian
#######################
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
for i in $(cat useradd.txt)
do
id ${i%%:*} &>/dev/null
if [ $? -eq 0 ];then
action "${i%%:*}已经存在!不能重复创建!" /bin/false
else
useradd ${i%%:*} &>/dev/null && echo ${i#*:} | passwd --stdin ${i%%:*} &>/dev/null
if [ $? -eq 0 ];then
action "用户${i%%:*}创建成功!" /bin/true
else
action "用户${i%%:*}创建失败!" /bin/false
fi
fi
done
3.执行结果
[root@xian /server/scripts]# sh for_useradd_lixian.txt.sh 用户lx1创建成功! [ 成功 ] 用户lx2创建成功! [ 成功 ] 用户lx3创建成功! [ 成功 ] 用户lx4创建成功! [ 成功 ] 用户lx5创建成功! [ 成功 ] [root@xian /server/scripts]# sh for_useradd_lixian.txt.sh lx1已经存在!不能重复创建! [失败] lx2已经存在!不能重复创建! [失败] lx3已经存在!不能重复创建! [失败] lx4已经存在!不能重复创建! [失败] lx5已经存在!不能重复创建! [失败]
四、批量创建用户脚本
1.脚本代码
[root@xian /server/scripts]# cat useradd.sh
#!/bin/bash
# File Name: useradd.sh
# Author: lixian
#######################
#调用函数
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#提示用户输入创建用户的前缀
read -p "请输入你要创建用户的前缀(必须为字母):" Qz
#判断用户输入的前缀是否为字母
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
action "错误:您输入的内容不符合要求!" /bin/false
exit
fi
#提示用户输入创建用户的数量
read -p "请输入创建用户的数量:" Num
#判断用户输入的数量是否为数字
if [[ ! $Num =~ [0-9]+$ ]];then
action "错误:您输入的数字不符合要求" /bin/false
exit
fi
#提示用户需要创建用户列表
echo "你创建用户为:${Qz}1..${Qz}${Num}"
read -p "你是否要创建这些用户?[yes/no]:" Confirm
#判断用户输入的选择
case $Confirm in
Yes|yes|Y|y)
action "收到指令!即将为您创建用户!" /bin/true
for i in $(seq $Num)
do
User=${Qz}${i}
id $User &>/dev/null
if [ $? -eq 0 ];then
action "用户${User}已经存在!" /bin/false
else
useradd $User &>/dev/null
if [ $? -eq 0 ];then
action "${User}用户创建成功!" /bin/true
else
action "${User}用户创建失败!" /bin/false
fi
fi
done
;;
No|no|N|n)
action "收到指令!拒绝创建用户!" /bin/true
exit
;;
*)
action "错误:您输入的内容不符合要求!" /bin/false
exit
esac
2.执行结果
五、系统管理工具箱脚本
1.脚本代码
[root@xian /server/scripts]# cat menu_case.sh
#!/bin/bash
# File Name: case-1.sh
# Author: lixian
#######################
#1.定义菜单函数
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
menu() {
cat<<EOF
+---------------------------+
| |
| 1. 帮助信息 |
| 2. 系统版本信息 |
| 3. 系统内核信息 |
| 4. 磁盘使用情况 |
| 5. 内存使用情况 |
| 6. 系统负载情况 |
| 7. 用户登录情况 |
| 8. 所有IP地址 |
| 9. 外网IP地址 |
| 0. 退出脚本 |
| |
+---------------------------+
EOF
}
menu
while true
do
#提示用户进行输入想要查看的信息
read -p "请根据菜单输入对应的数字获取对应的状态信息:" Num
#编写数字对应的功能命令
case $Num in
1)
clear
menu
;;
2)
echo "当前系统版本信息如下:"
awk '{print $1,$4}' /etc/redhat-release
;;
3)
echo "当前系统内核版本信息如下:"
uname -r
;;
4)
echo "当前系统磁盘使用情况如下:"
df -h
;;
5)
echo "当前系统内存使用情况如下:"
free -m
;;
6)
echo "当前系统负载情况如下:"
uptime
;;
7)
echo "当前系统用户登录的情况如下:"
w
;;
8)
echo "当前系统Eth0网卡IP地址如下:"
ifconfig eth0 | awk 'NR==2{print $2}'
;;
9)
echo "当前系统外网IP地址如下:"
curl -s ifconfig.me
echo
;;
0)
action "你已经成功退出了脚本!" /bin/true
exit
esac
done
2.执行结果
六、实现简单的Jumpserver
1.业务需求
1. 执行脚本时,可以看到你所能够管理的主机 主机清单
2. 提示用户要进行管理哪台主机 连接某台主机
3. 需要写个循环,连接完一台主机后,还可以继续连接其他主机 不能退出脚本
4. 不能让跳板机可以使用Ctrl + c d z 等操作
5. 用户不能管理你的跳板机 每次登陆系统,自动执行脚本
6. 给自己留个后门,自己能够出去,退出脚本,不能告诉别人怎样退出脚本
2.脚本代码
[root@xian /server/scripts]# cat jumpserver.sh
#!/bin/bash
# File Name: jumpserver.sh
# Author: lixian
#######################
#调用函数
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
Menu(){
cat<<EOF
+-----------------------------+
| |
| Jumpserver跳板机 |
| |
| 0.显示主机清单 |
| 1.连接-lb01 -172.16.1.5 |
| 2.连接-web01-172.16.1.7 |
| 3.连接-db01 -172.16.1.51 |
| 4.退出jumpserver脚本 |
| |
+-----------------------------+
EOF
}
#打印主机列表
Menu
#禁止执行Ctrl+c Ctrl+d Ctrl+z 等操作
trap "" HUP INT TSTP
#进行循环操作
while true
do
#提示用户输入需要连接哪台主机
read -p "请输入你需要操作的序号:" Num
#判断用户输入的是否为数字
if [[ ! $Num =~ ^[0-4]$ ]];then
action "你输入不符合规范,请输入0-4数字!" /bin/false
#跳出本次循环,继续下一次的循环
continue
fi
#根据菜单列表进行选择要管理的主机
case $Num in
0)
clear
Menu
;;
1)
action "即将连接lb01主机!" /bin/true
ping -c1 -W1 172.16.1.5 &>/dev/null
if [ $? -eq 0 ];then
action "检测lb01主机网络连接正常!" /bin/true
Port=$(nmap -p 22 172.16.1.5 |awk '/22/{print $2}')
if [ $Port == "open" ];then
action "检测lb01主机22端口开放正常!" /bin/true
action "正在连接lb01主机...请等待..."
ssh -o StrictHostKeyChecking=no root@172.16.1.5
else
action "失败:检测不到lb01主机的22端口,请检查再试!" /bin/false
continue
fi
else
action "失败:检测不到lb01主机!" /bin/false
continue
fi
;;
2)
action "即将连接web01主机!" /bin/true
ping -c1 -W1 172.16.1.7 &>/dev/null
if [ $? -eq 0 ];then
action "检测web01主机网络连接正常!" /bin/true
Port=$(nmap -p 22 172.16.1.7 |awk '/22/{print $2}')
if [ $Port == "open" ];then
action "检测web01主机22端口开放正常!" /bin/true
action "正在连接web01主机...请等待..."
ssh -o StrictHostKeyChecking=no root@172.16.1.7
else
action "失败:检测不到web01主机的22端口,请检查再试!" /bin/false
continue
fi
else
action "失败:检测不到web01主机!" /bin/false
continue
fi
;;
3)
action "即将连接db01主机!" /bin/true
ping -c1 -W1 172.16.1.51 &>/dev/null
if [ $? -eq 0 ];then
action "检测db01主机网络连接正常!" /bin/true
Port=$(nmap -p 22 172.16.1.51 |awk '/22/{print $2}')
if [ $Port == "open" ];then
action "检测db01主机22端口开放正常!" /bin/true
action "正在连接db01主机...请等待..."
ssh -o StrictHostKeyChecking=no root@172.16.1.51
else
action "失败:检测不到db01主机的22端口,请检查再试!" /bin/false
continue
fi
else
action "失败:检测不到db01主机!" /bin/false
continue
fi
;;
4)
read -s -p "请输入退出jumpserver的密码:" Quit
if [ $Quit == "gun" ];then
action "好,我滚了,已经退出脚本!再见!" /bin/true
exit
else
action "密码错误!请重新输入!" /bin/false
continue
fi
;;
*)
action "你输入不符合规范,请输入0-4数字!" /bin/false
continue
esac
done
3.执行结果
七、实现多级菜单
1.业务需求
主菜单 有退出脚本的功能
两个子菜单
执行脚本时,进入的是主菜单
根据主菜单进行选择进入子菜单
子菜单负责具体的命令
有返回上一级菜单的功能
2.脚本代码
[root@xian /server/scripts]# cat long_menu.sh
#!/bin/bash
# File Name: long_menu.sh
# Author: lixian
#######################
#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#定义菜单
menu() {
cat<<EOF
+----------主菜单-----------+
| |
| 1. 安装Nginx服务 |
| |
| 2. 安装PHP服务 |
| |
| 3. 退出脚本 |
| |
+---------------------------+
EOF
}
Nginx_menu(){
cat<<EOF
+-------安装Nginx服务-------+
| |
| 1. 安装Nginx-1.16版本 |
| |
| 2. 安装Nginx-1.18版本 |
| |
| 3. 返回上一级菜单 |
| |
+---------------------------+
EOF
}
PHP_menu(){
cat<<EOF
+--------安装PHP服务--------+
| |
| 1. 安装PHP-5.6版本 |
| |
| 2. 安装PHP-5.7版本 |
| |
| 3. 返回上一级菜单 |
| |
+---------------------------+
EOF
}
while true
do
menu
read -p "请根据菜单输入你需要操作的选项:" Install
case $Install in
1)
echo "安装Nginx服务版本菜单:"
while true
do
Nginx_menu
read -p "请输入你需要安装nginx服务的版本:" Install_Nginx
case $Install_Nginx in
1)
echo "正在安装nginx-1.16版本。。。"
sleep 5
echo "安装成功"
;;
2)
echo "正在安装nginx-1.18版本。。。"
sleep 5
echo "安装成功"
;;
3)
echo "返回上一级菜单"
break
;;
*)
echo "错误:请输入正确的选项"
esac
done
;;
2)
echo "安装PHP服务版本菜单:"
while true
do
PHP_menu
read -p "请输入你需要安装PHP服务的版本:" Install_PHP
case $Install_PHP in
1)
echo "正在安装php-5.6版本。。。"
sleep 5
echo "安装成功"
;;
2)
echo "正在安装php-5.7版本。。。"
sleep 5
echo "安装成功"
;;
3)
echo "返回上一级菜单"
break
;;
*)
echo "错误:请输入正确的选项" /bin/false
esac
done
;;
3)
action "退出脚本成功!" /bin/true
exit
;;
*)
echo "您输入的选项有误!请重新输入!"
;;
esac
done
3.执行结果
[root@xian /server/scripts]# sh long_menu.sh +----------主菜单-----------+ | | | 1. 安装Nginx服务 | | | | 2. 安装PHP服务 | | | | 3. 退出脚本 | | | +---------------------------+ 请根据菜单输入你需要操作的选项:1 安装Nginx服务版本菜单: +-------安装Nginx服务-------+ | | | 1. 安装Nginx-1.16版本 | | | | 2. 安装Nginx-1.18版本 | | | | 3. 返回上一级菜单 | | | +---------------------------+ 请输入你需要安装nginx服务的版本:2 正在安装nginx-1.18版本。。。 安装成功 +-------安装Nginx服务-------+ | | | 1. 安装Nginx-1.16版本 | | | | 2. 安装Nginx-1.18版本 | | | | 3. 返回上一级菜单 | | | +---------------------------+ 请输入你需要安装nginx服务的版本:3 返回上一级菜单 +----------主菜单-----------+ | | | 1. 安装Nginx服务 | | | | 2. 安装PHP服务 | | | | 3. 退出脚本 | | | +---------------------------+ 请根据菜单输入你需要操作的选项:3 退出脚本成功! [ 成功 ]





