linux学习--week20--shell

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.函数练习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容