美文网首页linux运维
linux学习--week20--shell

linux学习--week20--shell

作者: 亮仔_c1b5 | 来源:发表于2019-12-08 20:05 被阅读0次

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 ba
#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 ij
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.host ping -c1 -W1ip &>/dev/null
if [ ? -eq 0 ];then echo "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.i ping -c1 -W1ip &>/dev/null
if [ ? -eq 0 ];then echo "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 ip.txt) do #将第一层循环拿到ip,与第二层循环的端口进行探测 for port in(cat port.txt)
do
{
nc -z ipport
if [ ? -eq 0 ];then echo "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 (awk -F ":" '{print1}' /etc/passwd)
do
echo This is count User: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=namenumber
id username &>/dev/null if [? -eq 1 ];then
useradd username echo "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 [[ ! name =~ ^[a-Z]+ ]];then
echo "请输入正确的英文..."
exit
fi

read -p "请输入用户个数: " number
if [[ ! number =~ ^[0-9]+ ]];then
echo "请输入正确的数字..."
exit
fi

read -p "你确定要创建 name用户,并且创建number 个数 [ y | n ] " action

case action in y) for n in(seq number) do username=namen idusername &>/dev/null
if [ ? -eq 1 ];then useraddusername
action "username create is ok...." /bin/true else 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 "你确定要创建 name用户,创建number个数,统一密码$pass [ y | n ]" action

case action in y) for n in(seq number) do username=namen idusername &>/dev/null
if [ ? -eq 1 ];then useraddusername &&
echo pass | passwd --stdinusername &>/dev/null
echo "usernamepass 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 "你确定要创建 name用户,创建number个数,密码随机 [ y | n ]" action

case action in y) for n in(seq number) do username=namen pass=(mkpasswd -l 10 -d 3 -C 3 -c 3 -s 1)
id username &>/dev/null if [? -eq 1 ];then
useradd username && \ echopass | passwd --stdin username &>/dev/null echo "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 (cat user.txt) do idusername &>/dev/null
if [ ? -eq 1 ];then useraddusername
echo "username is create ok...." else 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 (cat user.txt) do user=(echo i | awk -F ":" '{print1}')
pass=(echoi | 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 line &>/dev/null if [? -eq 1 ];then
useradd line echo "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=(echoline | awk -F ":" '{print 1}') pass=(echo line | awk -F ":" '{print2}')

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 次, 失败了[ $count - 1 ] 次"

4.如何实现数据库分库备份?
[root@db01 ~]# cat mysql_dump.sh

!/usr/bin/bash

User=root
Pass=123456
Get_MySQL_Name=(mysql -uUser -p$Pass -B -e "show databases;"|egrep -v "Database|test|*_schema")
MySQL_Backup=/backup/mysql

for dbname in Get_MySQL_Name do #准备每个备份下来的库目录 if [ ! -dMySQL_Backup/dbname ];then mkdir -pMySQL_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=(mysql -uUser -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.预先定义好的变量 12 0# ? $$@ * 4.交互式定义变量read -p: 提示用户的输入信息 -t: 超时时间 -s: 不显示输入的内容(密码类) -n: 多少个字符 5.变量替换 # 从头到尾匹配,匹配一次 ## 从头到尾匹配,贪婪匹配 % 从尾匹配到头,匹配一次 %% 从尾匹配到头,贪婪匹配 // 替换一次 /// 替换多次 6.变量运算(()) [] expr 7.{#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.函数练习

相关文章

网友评论

    本文标题:linux学习--week20--shell

    本文链接:https://www.haomeiwen.com/subject/arxvgctx.html