网络运维Day11

news/2024/11/30 2:48:56/

文章目录

  • if语句
    • if单分支
      • 应用案例
    • if双分支
      • 应用案例
  • if多分支
      • 应用案例
  • for循环
  • while循环
    • 案例
  • 正则表达式
    • 基本正则
    • Perl兼容的正则
  • 综合练习
  • 总结

if语句

if单分支

if单分支的语法组成:

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

应用案例

判断用户名与密码是否为空

[root@som ~]# cd /root/shell/day01[root@som day01]# vim user_v1.sh
#!/bin/bash
read -p "请输入用户名:" user
read -s -p "请输入密码:" pass
if [ ! -z "$user" ];thenuseradd "$user"
fi
if [ ! -z "$pass" ];thenecho "$pass" | passwd --stdin "$user"
fi
echo

测试,输入用户名和密码

[root@som day01]# chmod  +x user_v1.sh 
[root@som day01]# ./user_v1.sh 
请输入用户名:testuser       						#输入用户名
请输入密码:更改用户 testuser 的密码 。
passwd:所有的身份验证令牌已经成功更新。

测试,直接回车

[root@som day01]# ./user_v1.sh 
请输入用户名:            							#直接回车
请输入密码:                 						 #直接回车

优化脚本,使用更简单的语句书写脚本,合并if语句

[root@som day01]# vim user_v2.sh
#!/bin/bash
read -p "请输入用户名:" user
read -s -p "请输入密码:" pass
if [ ! -z "$user" ] && [ ! -z "$pass" ];thenuseradd "$user"echo "$pass" | passwd --stdin "$user"
fi
[root@som day01]# chmod +x user_v2.sh 
[root@som day01]# ./user_v2.sh 
请输入用户名:testuser2
请输入密码:更改用户 testuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

if双分支

  • if双分支的语法组成:既可以执行成功的命令,也可以执行失败的命令
if  条件测试;then命令序列1
else  命令序列2
fi

应用案例

测试主机是否能ping通,需要用户输入一个参数,比如一个IP或者域名

[root@som day01]# vim if_ping.sh
#!/bin/bash
if [ -z "$1" ];thenecho -n "用法:脚本"echo -e "\033[32m域名或IP\033[0m"exit
fi
ping -c2 -i0.1 -W1 "$1" &> /dev/nullif [ $? -eq 0 ];thenecho "$1 is up"
elseecho "$1 is down"
fi
[root@som day01]# chmod +x if_ping.sh 
[root@som day01]# ./if_ping.sh 
用法:脚本域名或IP
[root@som day01]# ./if_ping.sh  192.168.4.7
192.168.4.7 is up
[root@som day01]# ./if_ping.sh  192.168.10.1
192.168.10.1 is down

if多分支

  • if多分支:针对多个条件分别执行不同的操作
if    条件测试1 ;then  命令序列1
elif  条件测试2 ;then  命令序列2
else命令序列n
fi

应用案例

[root@som day01]# echo $RANDOM             #系统随机生成的数字
[root@som day01]# vim guess_num.sh
#!/bin/bash
clear
num=$[RANDOM%10+1]
read -p "请输入1-10之间的整数:" guess
if [ $guess -eq $num ];thenecho "恭喜你,才猜对了,就是$num"
elif [ $guess -lt $num ];thenecho "Oops,猜小了"
elseecho "Oops,猜大了"
fi
[root@som day01]# chmod +x guess_num.sh
[root@som day01]# ./guess_num.sh
请输入1-10之间的整数:6
Oops,猜大了

for循环

  • 根据变量的不同取值,重复执行命令序列(for循环使用场合,在知道循环次数的时候使用)

for循环的语法结构:第一种格式

for  变量名  in  值列表
do命令序列
done

for循环范例,循环输出数字和字符

[root@som ~]# cd /root/shell/day01/
[root@som day01]# vim for_demo1.sh
#!/bin/bash
for i in 1 8 ab 99 qq
doecho "I am $i"
done

for循环的语法结构:第二种格式

for  ((初值;条件;步长))
do命令序列
done

案例:

[root@som day01]# vim for_demo2.sh
#!/bin/bash
for ((i=1;i<=5;i++))
doecho "I am $i"
done
[root@som day01]# chmod +x for_demo2.sh 
[root@som day01]# ./for_demo2.sh

循环创建10个系统账户(有规律的创建)

[root@som day01]# vim for_user.sh
#!/bin/bash
for i in {1..10}
douseradd test$iecho 123456 | passwd --stdin test$i
done
[root@som day01]# chmod +x for_user.sh 
[root@som day01]# ./for_user.sh

批量创建系统账户(无规律的创建,既可以读取用户名列表文件创建系统账户)

[root@som day01]# vim user.txt             #创建系统用户的文件
ocean
book
page
[root@som day01]# vim user.sh
#!/bin/bash
for i in $(cat user.txt)
douseradd $iecho 123456 | passwd --stdin $i
done
[root@som day01]# chmod  +x user.sh 
[root@som day01]# ./user.sh

while循环

  • 反复测试条件,只要成立就执行命令序列(死循环或者条件循环时使用【不知道循环次数时】)

while循环的语法结构:

while  条件测试
do命令序列
done

死循环语法结构

while :
do命令序列
done

练习while循环基本用法

定义i=1判断$i是否小于等于5,条件成立则执行循环语句

[root@som day01]# vim while_1.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
doecho $i
done

定义i=1判断 i 是否小于等于 5 ,条件成立则显示 i是否小于等于5,条件成立则显示 i是否小于等于5,条件成立则显示i,并执行let i++,如果条件失败,则循环结束

[root@som day01]# vim while_2.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
doecho $ilet i++
done
[root@som day01]# chmod +x while_1.sh
[root@som day01]# chmod +x while_2.sh
[root@som day01]# ./while_1.sh          			 #ctrl+C结束循环
[root@som day01]# ./while_2.sh

死循环脚本,输出hello word 和 nihao

[root@som day01]# vim while_3.sh
#!/bin/bash
while :
doecho hello worldecho nihao
done
[root@som day01]# chmod +x while_3.sh
[root@som day01]# ./while_3.sh

案例

  • 使用while循环批量创建有规律的用户,定义两个变量PREFIX和i,使用while循环,判断i小于等于5,条件满足会执行创建用户的命令,否则则退出脚本
[root@som day01]# vim uaddwhile.sh
#!/bin/bash
PREFIX="tuser"
i=1
while [ $i -le 5 ]
douseradd ${PREFIX}$iecho 123456 | passwd --stdin ${PREFIX}$i &> /dev/nulllet i++
done
[root@som day01]# chmod +x uaddwhile.sh 
[root@som day01]# ./uaddwhile.sh
  • 改编随机猜数脚本,可以无限次猜数,直到猜对才退出
[root@som day01]# vim guess_num2.sh
#!/bin/bash
num=$[RANDOM%10+1]
while :
doread -p "请输入1-10之间的整数:" guessif [ $guess -eq $num ];thenecho "恭喜,猜对了,就是$num."exit    elif [ $guess -lt $num ];thenecho "Oops,猜小了."else echo "Oops,猜大了."
fi
done
[root@som day01]# chmod +x guess_num2.sh 
[root@som day01]# ./guess_num2.sh

正则表达式

  • 正则表达式是一种基于字符模式匹配的文本处理工具

基本正则

在这里插入图片描述

[root@som ~]# grep root /etc/passwd                    #查找包含root的行
[root@som ~]# grep ^root /etc/passwd                  	#查找以root开头的行
[root@som ~]# grep bash$ /etc/passwd                 	#查找以bash结尾的行
[root@som ~]# grep "[abc]" /etc/passwd               	#查找包含a或者b或者c的行
[root@som ~]# grep "[^abc]" /etc/passwd             	#查找不包含a或者b或者c的其他内容
[root@som ~]# grep . /etc/passwd                       #查找任意单个字符
[root@som ~]# grep r.*t /etc/passwd                    #查找以r开头以t结尾的
[root@som ~]# grep "[0-9]*"  /etc/passwd          		#查找包含数字的,*代表任意次
[root@som ~]# grep "[0-9]\{3,4\}" /etc/passwd    		#查找包含数字3-4次的
[root@som ~]# grep "[0-9]\{3\}" /etc/passwd       		#查找包含3位数的

在这里插入图片描述

扩展正则的使用

[root@som ~]# grep -E "0{2,3}" /etc/passwd         #查找0出现2-3次
[root@som ~]# grep -E "[a-z]+"  /etc/passwd        #查找a-z等字母至少出现一次
[root@som ~]# grep -E "s?bin"  /etc/passwd         #查找sbin或者bin(?匹配前面的s字符0-1次)
[root@som ~]# grep -E "(root|daemon)" /etc/passwd  #查找root或者daemon
[root@som ~]# echo "ababab" | grep ab              #查找ab
ababab
[root@som ~]# echo "ababab" | grep -E "(ab)"       #查找ab
[root@som ~]# echo "ababab" | grep -E "(ab){2}"    #将ab组合,匹配两次

Perl兼容的正则

在这里插入图片描述

[root@som ~]# grep -P "bin" /etc/passwd      #匹配包含bin的行,只要包含bin字符的都出现
[root@som ~]# grep -P "\bbin\b" /etc/passwd  # \b单词边界,b前面不能有内容,n后面也不能有内容,只匹配bin
[root@som ~]# grep -P "\w"  /etc/passwd      #查找字母数字下划线
[root@som ~]# grep -P "\W"  /etc/passwd      #查找不是字母数字下划线部分
[root@som ~]# grep -P "\s"  /etc/passwd      #查找空白,空格,tab键都算
[root@som ~]# grep -P "\d"  /etc/passwd      #查找数字
[root@som ~]# grep -P "\D"  /etc/passwd      #查找非数字

综合练习

准备素材文件

[root@som ~]# python -c "import this" > /opt/python.txt		#生成素材文件

过滤/opt/python.txt文件中包含the的行

[root@day01 ~]# grep "the"  /opt/python.txt

过滤包含bet或者better的行

[root@day01 ~]# grep -E  "(bet|better)" /opt/python.txt

过滤包含1-2个字母o的行

[root@day01 ~]# grep -E  "o{1,2}" /opt/python.txt

过滤所有标点符号

[root@day01 ~]# grep -P "\W"  /opt/python.txt

过滤/opt/python.txt文件中以.结尾的行

[root@day01 ~]# grep "\.$" /opt/python.txt

过滤包含2个o的行

[root@day01 ~]# grep -E "o{2}" /opt/python.txt

过滤大写字母开头的行

[root@day01 ~]# grep  "^[A-Z]"  /opt/python.txt

总结

  • 掌握SHELL中的if判断语句
    • 单分支、双分支、多分支
  • 掌握for循环使用格式
  • 掌握while循环使用格式
  • 掌握正则表达式
    • 基本正则、扩展正则、Perl兼容正则

http://www.ppmy.cn/news/1212351.html

相关文章

环形链表解析(c语言)c语言版本!自我解析(看了必会)

目录 1.判断一个表是否是环形链表&#xff01; 代码如下 解析如下 2.快指针的步数和慢指针的步数有什么影响&#xff08;无图解析&#xff09; 3.怎么找到环形链表的入环点 代码如下 解析如下 1.判断一个表是否是环形链表&#xff01; 代码如下 bool hasCycle(struct L…

王学岗visibility改变后调用onLayout()

自定义控件的时候发现了一个bug。 Button位移动画执行结束后我设置了一个不相关的TextView的可见性由gone变为visible.令人郁闷的是&#xff0c;只要我注释的地方放开。动画执行结束后button都会重新绘制在位移动画开始的位置。注释掉这段代码就正常。 经过分析后得知 View的Vi…

记录bug1

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…

java excel、word、PPT转换成pdf预览

先引入包&#xff1a;[lib下载地址](https://mp.csdn.net/mp_download/manage/download/UpDetailed)Controllerpublic AjaxResult fileToPdf(RequestBody VerifyCode url, HttpServletResponse response, HttpServletRequest request) throws IOException {String fileUrl req…

springMVC 导出Excel ,并提供下载(处理日期格式问题)

目录 1、POI的三个依赖 2、控制层代码 3、业务层代码 4、参考文献&#xff1a; 1、POI的三个依赖 <!-- POI的三个依赖 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</vers…

Apache和Nginx实现虚拟主机的3种方式

目录 首先介绍一下Apache和nginx&#xff1a; Nginx和Apache的不同之处&#xff1a; 虚拟主机 准备工作 Apache实现&#xff1a; 方法1&#xff1a;使用不同的ip来实现 方法2&#xff1a;使用相同的ip&#xff0c;不同的端口来实现 方法3&#xff1a;使用相同的ip&…

第二章 智能家居子系统——C51单片机 配置波特率115200

前言 本章为智能家居项目的第二章&#xff0c;本章主要写51单片机的定时器timer&#xff0c;串口UART&#xff0c;中断&#xff0c;外接模块DHT11 同项目其他博文&#xff1a; 项目的概述链接&#xff1a;Linux智能家居项目概述-CSDN博客 第一章 主控代码开发链接&#xff1a…

Easypoi map方式导入数据 ,List<Map<String, String>> 日期项数据为空(null)解决办法

目录 前言解决办法 前言 在使用easypoi map的方式解析excel文件&#xff0c;若文件中的某列数据格式是日期类型&#xff0c;那么它这个工具是读取不到&#xff0c;因为它的源码读取到某列为日期格式&#xff0c;数据必须为字符串类型&#xff0c;它才会处理 switch (cell.get…