shell 变量
if 条件判断
case 判断 (选择) <--服务启停
1.nginx启停脚本
2.php-fpm启停脚本
shell 循环
for
while
shell 函数
for循环
1.指定取值列表
2.设定变量,循环变量的值 ---> 分库 分表 备份
3.通过命令方式
4.C语言语法结构
需求2:同时输出1-9的升序和降序
[root@bgx shell]# sh for-9.sh
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1
使用for传统方式
a=9
b=1
for i in {1..9}
do
echo num is a
#a=a - 1 ]
#b=b + 1 ]
let a-- #变量自减
let b++ #变量自增
done
使用c语言方式
for ((i=1,j=9;i<10;i++,j--))
do
echo num is j
done
需求1:批量探测某个网段的主机存活状态,将存活的主机存入ok.txt文件中。
[root@oldxu /scripts/shell-for]# cat for-8.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-8.sh
###############################################################
for host in {1..254}
do
{
> ok.txt
ip=172.16.1.ip &>/dev/null
if [ ip"
fi
}&
done
echo "ok.........."
需求2:判断主机存活状态,要求判断三次,如果三次失败则失败。
嵌套循环
1.总共第一层循环需要循环3次
for i in {1..3}
do
#2.直接进入第二层循环(总共要循环三次)
for count in {1..3}
do
ip=172.16.1.ip &>/dev/null
if [ ip is ok..."
break #跳出当前的循环
fi
done
done
需求3:
现在有一个ip.txt的文件,里面有很多IP地址。
还有一个port.txt的文件,里面有很多端口号。
现在希望对ip.txt的每个IP地址进行端口的探测,探测的端口号来源于port.txt文件中,最后将开放的端口和IP保存到一个ok.txt文件。
ip.txt port.txt
10.0.0.1 80
10.0.0.2 22
10.0.0.3 3306
10.0.0.4 23
10.0.0.5 443
10.0.0.6 9000
10.0.0.7 123
10.0.0.8 6379
10.0.0.9 10050
172.16.1.5 10051
192.168.10.1
172.16.1.6
[root@oldxu /scripts/shell-for]# cat for-10.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-10.sh
###############################################################
for ip in (cat port.txt)
do
{
nc -z port
if [ ip $port is ok...."
fi
}&
done
done
wait
echo "扫描工作结束...."
需求4:获取系统的所有用户并输出。效果如下:
This is 1 user: root
This is 2 user: bin
This is 3 user: daemon
This is 4 user: adm
...............
[root@oldxu /scripts/shell-for]# cat for-11.sh
!/bin/bash
count=1
for user in 1}' /etc/passwd)
do
echo This is user
let count++
done
需求5:批量创建100个用户,比如输入oldxu则会创建oldxu01-10。
1.需要用户输入 read
2.循环遍历100次 for
3.执行shell命令 useradd
4.如果用户创建了,则跳过,继续下一个用户创建
[root@oldxu /scripts/shell-for]# cat for-user-1.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-1.sh
###############################################################
read -p "请输入你要创建的用户名称: " name
for number in {1..10}
do
username=number
id ? -eq 1 ];then
useradd username create is ok...."
else
echo "$username already exists...."
fi
done
需求6:批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。
1.需要人为指定用户名称 用户个数
2.需要用户确认创建
3.需要根据用户输入的个数,进行次数的循环
4.执行shell命令 useradd
5.如果用户创建了,则跳过,继续下一个用户创建
需求7:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。例如:前缀oldxu,个数10,代表创建oldxu1~oldxu10,总共10个用户。
[root@oldxu /scripts/shell-for]# cat for-user-2.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-2.sh
###############################################################
source /etc/init.d/functions
提示用户填写用户的名称,用户的个数
read -p "请输入用户前缀: " name
if [[ ! ]];then
echo "请输入正确的英文..."
exit
fi
read -p "请输入用户个数: " number
if [[ ! ]];then
echo "请输入正确的数字..."
exit
fi
read -p "你确定要创建 number 个数 [ y | n ] " action
case (seq nameusername &>/dev/null
if [ username
action "username already exists...." /bin/false
fi
done
;;
n)
exit
;;
*)
echo "USAGE: $0 [ y | n ]"
exit
esac
需求8:循环批量创建用户,需要填入用户的数量、用户的前缀、用户的统一密码(使用read、case、for语句)
1.需要人为指定用户名称 用户个数 用户统一密码 ( 123 )
2.需要用户确认创建
3.需要根据用户输入的个数,进行次数的循环
4.执行shell命令 useradd
5.如果用户创建了,则跳过,继续下一个用户创建
[root@oldxu /scripts/shell-for]# cat for-user-3.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-3.sh
###############################################################
read -p "请输入创建的用户名称: " name
read -p "请输入创建的用户个数: " number
read -p "请输入创建的用户密码: " pass
read -p "你确定要创建 number个数,统一密码$pass [ y | n ]" action
case (seq nameusername &>/dev/null
if [ username &&
echo username &>/dev/null
echo "pass Is Create Ok...."
fi
done
;;
n)
exit
;;
*)
echo "USAGE: $0 [ y | n ]"
exit
esac
需求9:循环批量创建用户,需要填入用户的数量、用户的前缀、随机设定密码,密码复杂度10位(使用read、case、for语句)
[root@oldxu /scripts/shell-for]# cat for-user-4.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-3.sh
###############################################################
read -p "请输入创建的用户名称: " name
read -p "请输入创建的用户个数: " number
read -p "你确定要创建 number个数,密码随机 [ y | n ]" action
case (seq name(mkpasswd -l 10 -d 3 -C 3 -c 3 -s 1)
id ? -eq 1 ];then
useradd pass | passwd --stdin username $pass Is Create Ok...."
fi
done
;;
n)
exit
;;
*)
echo "USAGE: $0 [ y | n ]"
exit
esac
需求10:通过读入文件中的用户,进行批量添加用户。
[root@oldxu /scripts/shell-for]# cat for-user-5.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-5.sh
###############################################################
for username in username &>/dev/null
if [ username
echo "username is already exists"
fi
done
需求11:通过读入文件中的用户与密码文件,进行批量添加用户。文件中的格式: user:passwd
[root@oldxu /scripts/shell-for]# cat for-user-6.sh
!/bin/bash
###############################################################
Author: oldxu
Date: 19-12-08
FileName: for-user-6.sh
###############################################################
for i in (echo 1}')
pass=i | awk -F ":" '{print $2}')
id $user &>/dev/null
if [ $? -eq 1 ];then
useradd $user && \
echo $pass | passwd --stdin $user &>/dev/null
echo "$user ---> $pass is create ok"
fi
done
while
1.文件比对 [ -f -d -e ]
2.整数比对 [ -eq -ne -ge -gt -le -lt ]
3.字符串比对 [ == != ]
4.逻辑语句 true
循环中的控制语句
break
continue
exit
1.使用while读入文件方式,批量创建用户
while read line
do
id ? -eq 1 ];then
useradd line is create ok..."
fi
done<user.txt
2.使用while读入文件方式,批量创建用户以及密码
user.txt
affg1:123
affg2:456
affg3:789
affg4:890
while read line
do
user=line | awk -F ":" '{print (echo 2}')
id $user &>/dev/null
if [ $? -eq 1 ];then
useradd $user && \
echo "$pass" | passwd --stdin $user &>/dev/null
echo "$user ---> $pass is ok....."
fi
done<user.txt
3.示例: 猜数字游戏
1)随机输出一个1-100的数字
2)要求用户输入的必须是数字(数字处加判断)
3)如果比随机数小则提示比随机数小了 大则提示比随机数大了
4)正确则退出 错误则继续死循环
5)最后统计猜了多少次(猜对了多少次,失败多少次)
sj=RANDOM % 100 ]
count=0
while true
do
read -p "请输入你要猜的数字: " number
#用户只要输入的不是数字,后面的代码都不执行,然后程序会回到循环的开始,继续执行
if [[ ! $number =~ ^[0-9]+$ ]];then
continue
fi
let count++
if [ $number -gt $sj ];then
echo "你的数字太大了..."
elif [ $number -lt $sj ];then
echo "你的数字太小了..."
else
echo "恭喜你,猜对了..."
break
fi
done
echo "你总共猜了 [ $count - 1 ] 次"
4.如何实现数据库分库备份?
[root@db01 ~]# cat mysql_dump.sh
!/usr/bin/bash
User=root
Pass=123456
Get_MySQL_Name=User -p$Pass -B -e "show databases;"|egrep -v "Database|test|*_schema")
MySQL_Backup=/backup/mysql
for dbname in MySQL_Backup/MySQL_Backup/$dbname
fi
mysqldump -u$User -p$Pass -B $dbname > $MySQL_Backup/$dbname/${dbname}_$(date +%F).sql
done
4.如何实现数据库分库分表备份?使用循环实现?
[root@db01 ~]# cat mysql_dump_tables.sh
#!/usr/bin/bash
User=root
Pass=123456
Get_MySQL_Name=User -p$Pass -B -e "show databases;"|egrep -v "Database|test|*_schema")
MySQL_Backup=/backup/mysql
#1.拿到所有的数据库的名称
for dbname in $Get_MySQL_Name
do
#2.进入第一个数据库的名称中,获取所有的表名称,赋值给dbtable变量
dbtable=$(mysql -u$User -p$Pass -B -e "use $dbname; show tables;" | grep -v "Tables*")
#3.使用嵌套循环,遍历dbtable变量的表名称,然后赋值给number变量
for number in $dbtable
do
if [ ! -d $MySQL_Backup/$dbname ];then
mkdir -p $MySQL_Backup/$dbname
fi
#备份指定的库名称,不同名称的表
mysqldump -u$User -p$Pass $dbname $number > $MySQL_Backup/$dbname/${number}_$(date +%F).sql
done
done
variables
if
case
for
while
functions
1.定义函数
2.调用函数
3.函数传参
4.函数返回
echo: 返回函数中的数据
return: 返回函数中的状态码 0 1 便于后面命令调用该函数时, 可以进行判断
需求1:使用函数、循环、case实现系统管理工具箱。
需求2:使用case、循环、函数、实现JumpServer跳板机功能。
1.用户登陆该服务器则自动执行该脚本。
2.脚本提示可连接主机列表。
3.该脚本无法直接退出。
jumpserver --->docker安装
teleport
需求3:实现多级菜单功能,需要使用到函数、case、循环、if判断。
作业:
1.实现主机分组的菜单
2.多级菜单功能完善
3.使用shell 安装 LNMP LNMT 架构
1.什么是变量
传递数据的一种方式 固定的名称 ---> 不固定的值
2.变量定义规范
1.命名
2.变量 = 值 之间不能出现空格
3.如何定义变量
1.自定义变量
2.系统环境变量 (系统自带,谁都可用)
3.预先定义好的变量 2 # @ (()) {#var} #统计变量的字符长度
8.变量自增和自减
注意: {} (())
if:
1.什么是if
2.if使用场景
3.if语法
单分支
双分支
多分支
4.if使用例子
5.条件测试语句
基于文件 -d -f -e 备份
基于字符 = != 字符串比较,需要别人输出字符串确定的
基于整数 -eq -ne -lt -gt -ge -le
基于正则 [[ =~ 正则语句 ]]
case
1.什么是case , 根据条件进行选择, 而选择内容是提前预设定好的
2.case使用场景
1.服务的启动与停止
2.编写菜单页面
3.简单跳板机程序
3.case基本的语法
4.case示例脚本
for
1.什么是for循环
2.for循环语法实例
3.for循环中练习脚本
while
1.while循环介绍
2.while基础语法
3.while循环判断语句
文件方式
整数方式
字符方式
读入文件
4.while练习
循环中关键字
break 结束本次循环
exit 结束脚本
continue 结束当前循环开始下一次
shell函数
1.介绍函数
2.定义函数
3.调用函数
4.函数传参
5.函数返回
echo: 返回函数中的数据
return: 返回函数中的状态码 0 1 便于后面命令调用该函数时, 可以进行判断
6.函数练习
网友评论