当前位置: 首页 > news >正文

培训第十五天(shell脚本与sed的学习)

上午

1、回顾:文件版本控制(git)

Git 本身并没有固定的特定端口。

通常,Git 协议使用的默认端口取决于所使用的传输协议。例如:

  • SSH 协议:默认端口是 22 。

  • HTTP 协议:默认端口是 80 。

  • HTTPS 协议:默认端口是 443 。

(我们使用的是22端口)

1、安装git软件 yum -y install git

2、创建仓库

mkdir /gitrepo

cd /gitrepo

3、初始化文件夹 git init

4、创建文件和目录

touch abc

mkdir abc/efg

5、将文件提交到暂存

git add .

6、将暂存区域的文件提交仓库

git commit -m “说明”

7、推送到远程仓库

git push

8、获取远程仓库的更新

git pull

9、克隆远程仓库

git clone ..........

分支,提高代码灵活性

10、检查分支 git branch (*所在分支为当前分支)

11、创建新分支 git branch 新分支名称

12、跳转分支 git checkout 分支名称

13、在新建分支的同时跳转分支 git checkout -b 新分支名称

14、删除分支 git branch -d|D 分支名称

15、合并分支

跳转到主分支合并分支

git checkout master

git merge b

16、合并冲突

手动解决

2、shell 脚本编写注意事项

shell命名: shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾

不能使用特殊符号、空格

名称要写的一眼可以看出功能,也就是顾名思义

shell脚本首行需要#!/bin/bash开头

shell脚本变量不能以数字、特殊符号开头,可以使用下划线 _,但不能 用破折号——

3、shell脚本学习

(1)编写简单的脚本

source helloword.sh运行脚本与直接运行脚本(例如 bash helloword.shsh helloword.sh )的主要区别在于,source 命令会在当前 shell 进程中执行脚本,脚本中定义的变量和对环境的更改会直接影响当前的 shell 环境。

 编写hello world输出脚本[root@lib ~]#  vim helloword.sh#!/bin/bashecho "hello  world!"ls -lh /etc/[root@lib ~]#  bash helloword.sh   //指示 Bash 解释器去执行名为 helloword.sh 的脚本文件[root@lib ~]#  sh helloword.sh   //使用系统默认的 sh 解释器来执行名为 helloword.sh 的脚本[root@lib ~]#  source helloword.sh   //在当前的 shell 环境中读取并执行 helloword.sh 脚本中的命令 [root@lib ~]#  chmod +x helloword.sh   //为 helloword.sh 脚本文件添加可执行权限[root@lib ~]#  ./helloword.sh    //在当前目录下直接运行名为 helloword.sh 的脚本编写 nginx 安装脚本 1.安装依赖环境2.下载nginx压缩包3.解压4.make和make install安装[root@lib ~]# vim nginx.sh#!/bin/bashyum -y install gcc gcc-c++ make pcre-devel openssl-devel wgetcd /usr/local/src/wget 'https://nginx.org/download/nginx-1.24.0.tar.gz'tar -xf nginx-1.24.0.tar.gzcd nginx-1.24.0./configure --prefix=/usr/local/nginxmake -j 4   # 使用 make 工具进行编译或构建操作,并指定了同时运行的作业数量为 4    # -j 选项用于并行执行任务,以加快构建的速度。通过指定 4 ,表示 make 最多可以同时执行 4 个并行的任务。make install[root@lib ~]# bash nginx.sh [root@lib ~]# /usr/local/nginx/sbin/nginx 

4、变量的应用

(1)概念

变量用来存放系统或用户需要使用的特定参数或者值,变量的值可以根据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可使脚本更加灵活,适应性更强。

与变量相对应的是常量,常量例如“Hello World”,是不可改变的

变量可以给个变量名,假如为name,值是可变的

(2)变量注意事项

变量命名规则:由大写字母、小写字母、下划线、数字组成,并且首字母不能是数字

在变量命名时:建议也简写出该变量是什么用处

变量值的类型:值的类型会分为整型、浮点型、字符串型、布尔型等, 而且使用变量需要指定类型

Shell 默认的变量类型都是字符串,无需指定类型

(3)变量的分类
1、自定义变量:由用户自己定义、使用和修改
 [root@lib ~]# b=3   //将b赋值为3     左边是变量名、右边是值[root@lib ~]# echo $b   //输出变量b的值3[root@lib ~]# unset b   //取消赋值    清除变量[root@lib ~]# echo $b   //变量b显示为空

变量名=值中,等于号=之前和之后不能有空格

变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。

2、环境变量:由系统维护,用于设置工作环境
 [root@lib ~]# echo $USER  //输出当前登录用户root[root@lib ~]# echo $PATH  //输出默认路径/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@lib ~]# echo $PWD   //输出当前位置/root[root@lib ~]# echo $SHELL   //输出当前的编辑器/bin/bash[root@lib ~]# env   //查看所有环境变量,编写脚本或者应用需要参数的时候可以使用

其中PATH变量用于设置可执行程序的默认搜索路径,可以修改全局变量文件/etc/profile 或修改某用户家目录下的~/.bash_profile文件永久改变环境变量。

3、位置变量:通过命令行给脚本程序传递参数 (也属于预定义变量)

为了在使用Shel脚本程序时,方便通过命令行为程序提供操作参数, Bash引入了位置变量的概念位置变量有 ,n,n为1~9之间的数字

$0:第一个字段表示命令名或脚本名称

$1:脚本要处理的第一个参数

$2:脚本要处理的第二个参数

......

Shell脚本最多可以直接处理9个参数

 在脚本中读取到5个参数并且输出到终端:[root@lib ~]# vim canshu.sh#!/bin/bashecho $1echo $2echo $3echo $4echo $5[root@lib ~]# source canshu.sh a b c d eabcde创建一个用户并为用户设置登录密码:[root@lib ~]# vim passwd.sh#!/bin/bashuseradd $1echo $2 | passwd --stdin $1[root@lib ~]# source passwd.sh aa aa更改用户 aa 的密码 。passwd:所有的身份验证令牌已经成功更新。
* 4、预定义变量 : Bash中内置的一类变量,不能直接修改

预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。

$0:代表脚本本身的文件名。

$#:表示传递给脚本的参数个数。

$*:以一个字符串的形式返回所有的参数。

$@:以多个字符串的形式返回所有的参数,每个参数占一行。

$$:当前脚本的进程 ID 。

$?:上一个命令的退出状态。如果上一个命令成功执行,返回 0 ;否则返回非 0 值。

 [root@lib ~]# vim 1.sh#!/bin/bash#将所有的脚本参数输出在终端for x in "$*"    //将所有参数整合到一起,总共列为一行doecho $xdone[root@lib ~]# source 1.sh abc cde hhh 123abc cde hhh 123[root@lib ~]# vim 1.sh#!/bin/bash#将所有的脚本参数输出在终端for x in "$@"    //将所有参数单个列出,每个参数单列一行doecho $xdone[root@lib ~]# source 1.sh abc cde hhh 123abccdehhh123[root@lib ~]# vim 1.sh#!/bin/bash#将所有的脚本参数输出在终端#!/bin/bashfor x in "$@"doecho $xdoneecho $?echo "该脚本是:$0"echo "此脚本⼀共处理了$#个参数"[root@web ~]# source 1.sh 1 2 3 4 12340    //$?的结果,表示上个命令执行成功该脚本是:-bash    //-bash 是 shell 的提示符,表示等待您输入新的命令。此脚本⼀共处理了4个参数[root@web ~]# sh 1.sh 1 2 3 4 12340该脚本是:1.sh     //$0的结果,也就是该脚本的名称此脚本⼀共处理了4个参数   //$#的结果,执行脚本时,输入了多少参数
(4)变量的定义与输出
1、定义一个新的变量

格式:变量名=变量值

注意:变量名必须以字母或下划线开头,严格区分大小写

2、变量符号运用

双引号:允许通过$符号引用其他变量值

单引号:禁止引用其他变量值,$视为普通字符

反撇号: 或$(): 命令替换,提取命令的执行结果

 [root@localhost shell]# X=aaa[root@localhost shell]# echo "$X" # 双引号可以使用变量aaa[root@localhost shell]# echo '$X' # 单引号只显示符号内的字符$X[root@localhost shell]# ip1=`ifconfig ens32 | grep -w inet | awk '{print$2}'` # ``反撇号可以引用命令[root@localhost shell]# ip2=$(ifconfig ens32 | grep -w inet | awk '{print$2}') # $()与反撇号作用相同[root@localhost shell]# echo $ip1192.168.100.100[root@localhost shell]# echo $ip2192.168.100.100[root@localhost shell]# x=100[root@localhost shell]# y=50[root@localhost shell]# z=`expr $x + $y` # 整数运算[root@localhost shell]# echo $z150[root@localhost shell]# x=1.4[root@localhost shell]# expr $x + 1 # 判断是否为浮点数  expr: ⾮整数参数[root@localhost shell]# [ $? -ne 0 ] && echo "x为浮点数"x为浮点数
3、输入和输出

输入格式:read [-p "显示的提示信息"] 变量名 ( -s 无回显)

输出格式:echo $变量名

 [root@localhost shell]# read x y # 输⼊,变量输入,在下一行输入1 3[root@localhost shell]# echo $x $y # 输出,直接输出变量1 3[root@localhost shell]# read -p "请输⼊你要赋值的变量值" x y请输⼊你要赋值的变量值1 5 [root@localhost shell]# echo $x $y1 5[root@localhost shell]# vim ip.sh # 编写一个查看IP的脚本,内容如下#!/bin/bashread -p "请输⼊接⼝名称:" x # 输入x变量等于什么,脚本内不用写,命令行输入该变量x等于什么即可,该变量x可在脚本内引用ifconfig $x | grep -w inet | awk '{print $2}'     # grep -w inet 会在这些信息中精确匹配包含单词 inet 的行:wq[root@localhost shell]# sh ip.sh请输⼊接⼝名称:ens32192.168.100.100[root@localhost shell]# sh ip.sh请输⼊接⼝名称:lo127.0.0.1[root@localhost shell]# vim read.sh # 编写输入账号密码的脚本,内容如下#!/bin/bashread -p "请输⼊您的姓名:" name # 该变量name是在命令行输入的,相当于变量=值read -p "请输⼊您的密码:" passwd # 该变量passwd是在命令行输入的,相当于变量=值if [ $passwd = "123456" ]; then # if判断语句,如果(if)某某等于某某,那么(then)执行什么命令,否则(else)执行什么命令,结尾fiecho "你好,$name !"elseecho "抱歉,您输⼊的密码不正确!"fi:wq[root@localhost shell]# sh read.sh请输⼊您的姓名:admin请输⼊您的密码:112233抱歉,您输⼊的密码不正确![root@localhost shell]# sh read.sh请输⼊您的姓名:admin请输⼊您的密码:123456你好,admin ![root@lib ~]# read -p "输入一个数据:" s   //有回显输入一个数据:啊啊[root@lib ~]# echo $s啊啊[root@lib ~]# read -p "输入一个数据:" -s s   //无回显输入一个数据:[root@lib ~]# echo $shh[root@lib ~]# vim 1.sh#!/bin/bashread -p "username:" usernameread -s -p "passwd:" passwduseradd $usernameecho $passwd | passwd --stdin $usernameif [ $? -eq 0 ] ; thenecho "账户$useradd注册成功"elseecho "注册失败"fi[root@lib ~]# source 1.sh username:ccpasswd:更改用户 cc 的密码 。passwd:所有的身份验证令牌已经成功更新。账户注册成功
(5)变量的作用范围

默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。

为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。

格式 1:export 变量名

格式 2:export 变量名=值

 [root@localhost shell]# x=aaa[root@localhost shell]# export y=bbb # 使y=bbb导出为全局变量,即使下次更新环境变量,y也会生效,相当于在/etc/profile内永久赋值[root@localhost shell]# hostname shell[root@localhost shell]# bash[root@shell shell]# echo $x[root@shell shell]# echo $ybbb
(6)变量的数学运算
1、数学运算

在 Shell 脚本中,自定义变量的计算可以通过多种方式实现。

一种常见的方式是使用 expr 命令。例如,如果您定义了两个变量 num1num2

 num1=5num2=3result=`expr $num1 + $num2`echo $result

另一种常用的方式是使用 $(( )) 表达式。比如:

 num1=5num2=3result=$((num1 + num2))echo $result

此外,如果您使用的是 bash ,还可以使用 let 命令:

 num1=5num2=3let result=num1+num2echo $result
2、精度计算

精度计算前,先安装bc这个软件才可进行,否则只能进行整数运算

 [root@shell shell]# yum -y install bc [root@shell shell]# x=123[root@shell shell]# y=111[root@shell shell]# echo "scale=5; $x / $y" | bc1.10810

5、判断语法

(1)条件判断$?的应用

Shell的返回值:运行一条命令,都会有一个返回值。0代表执行正常,非0代表命令执行异常。

 [root@localhost test]# ls /bin dev home lib64 mnt proc run srv tmp varboot etc lib media opt root sbin sys usr[root@localhost test]# echo $? # $?保存了上条命令的返回值,0表示执行成功,非0表示执行失败0[root@localhost test]# ls /hahals: ⽆法访问'/haha': 没有那个⽂件或⽬录[root@localhost test]# echo $?2
(2)if条件判断语句

1、if 单分支语句

 if 条件判断; then条件成⽴执⾏的命令(可以有多个命令,命令执行方式为逐行执行要么全执行,要么全不执行)fi

2、if 多分支语句

 if 条件判断; then条件成⽴执⾏的命令(可以有多个命令)else条件不成⽴执⾏的命令(可以有多个命令)fi

条件判断:可以有数字判断、字符串判断、⽂件判断等

(3)数字判断

1、格式

-eq:equal,等于,一般用于 [ $? -eq 0 ],也就是判断上条命令返回值等于 0,直接数字 -eq 数字也可以

-ne:not equal,不等于,一般用于 [ $? -ne 0 ],判断上条命令返回值不等于 0

-gt:greater than,大于

-ge:greater or equal,大于或等于

-lt:less than,小于

-le:less or equal,小于或等于

2、测试

 [root@localhost test]# test 2 -eq 2 # test:shell环境中,测试条件表达式的命令工具[root@localhost test]# echo $?0[root@localhost test]# test 3 -eq 2 # 测试3等于2[root@localhost test]# echo $?1 # 返回值为1,说明测试的3等于2这条命令不成立[root@localhost test]# [ 2 -eq 2 ] # 编程中习惯使⽤[ ]中括号[root@localhost test]# echo $?0[root@localhost test]# [ 3 -eq 2 ][root@localhost test]# echo $?1简单的数字判断脚本[root@localhost test]# vim if.sh#!/bin/bashnum1=3 # 给定变量num1num2=3 # 给定变量num2if [ $num1 -eq $num2 ];then # 判断num1变量是否等于num2echo "$num1 equal $num2" # 如果等于,那么执行命令,echo输出fi:wq[root@localhost test]# sh ./if.sh3 equal 3检测网络是否畅通脚本[root@localhost test]# vim ping.sh#!/bin/bashread -p "请输⼊要测试的⽹址:" web # read:命令行内输入web的变量值ping -c 3 $web &> /dev/null # ping -c 3,连接某个网站三次if [ $? -eq 0 ];then # 如果ping命令执行成功,那么echo "此时⽹络畅通!" # 输出“此时网络畅通”else # 否则echo "⽆法访问,请检查⽹址是否输⼊正确或检查相关的⽹络配置!" # 输出“无法访问...”fi # if语句的结尾:wq[root@localhost test]# sh ./ping.sh请输⼊要测试的⽹址:www.baidu.com此时⽹络畅通!
*(4)字符串判断

1 、格式

[ 字 符 串 1 = = 字 符 串 2 ] 字 符 串 内 容 相 同

[ 字 符 串 1 != 字 符 串 2 ] 字 符 串 内 容 不 同

[ - z 字 符 串 ] 字 符 串 内 容 为 空

[ - n 字 符 串 ] 字 符 串 内 容 不 为 空

2、测试

 [root@localhost test]# [ aaa == aaa ] # aaa字符串等于aaa[root@localhost test]# echo $?0 # 命令返回值为0,说明aaa==aaa[root@localhost test]# [ aaa == bbb ] # aaa字符串等于bbb[root@localhost test]# echo $?1 # 命令返回值为非0,说明aaa不等于bbb[root@localhost test]# [ -z aaa ] # aaa字符串为空字符串[root@localhost test]# echo $?1 # 命令返回值为非0,说明aaa字符串不为空[root@localhost test]# [ -z ] # 直接引用空字符串[root@localhost test]# echo $?0 # 命令返回值为0,说明上条判断命令为空字符串[root@localhost test]# [ -n aaa ] # aaa为非空字符串[root@localhost test]# echo $?0 # 命令返回值为0,说明aaa为非空字符串简单的字符串判断脚本[root@localhost test]# vim zifu.sh#!/bin/bashread -p "请输⼊账号:" nameif [ "$name" == "admin" ];then # 字符串判断需要加双引号echo "欢迎您,$name!"else echo "系统未查询到此账号,请您重新输⼊!"fi :wq[root@localhost test]# sh ./zifu.sh请输⼊账号:admin欢迎您,admin![root@localhost test]# sh ./zifu.sh请输⼊账号:ads系统未查询到此账号,请您重新输⼊!rpm 查询软件是否安装的脚本[root@localhost test]# vim rpm.sh#!/bin/bashread -p "请输⼊你要检测的rpm包:" rpmname # 命令行输入rpmname变量值result=`rpm -qa $rpmname` # 设置result变量为`rpm -qa $rpmname`命令if [ -z "$result" ];then # 判断result变量内的命令执行后的值是否为空echo "${rpmname} is not find!" # 如果为空则输出这条else echo "${rpmname} is find!" # 否则输出这条fi:wq[root@localhost test]# sh ./rpm.sh请输⼊你要检测的rpm包:nginxnginx is not find![root@localhost test]# sh ./rpm.sh请输⼊你要检测的rpm包:lrzszlrzsz is find!
*(5)文件、目录、权限的判断

1、格式

[ 操作符 文件或目录]

常用的测试操作符:

-e "文件目录或自定变量"判断文件或目录是否存在 exists
-f "文件目录或自定变量"判断是否为文件 isfile
-d "文件目录或自定变量"判断是否为目录 isdirect
-w "文件目录或自定变量"判断是否可写 w
-r "文件目录或自定变量"判断是否可读 r
-x "文件目录或自定变量"判断是否可执行 x
-s "文件目录或自定变量"判断文件大小,非0时为真 (若为非空文件,则为真) size
-z "文件目录或自定变量"判断变量参数值是否为空,为空为真,非空为假 zore

2、测试

 [root@localhost test]# [ -e "/etc/passwd" ] # 判断/etc/passwd文件是否存在[root@localhost test]# echo $?0[root@localhost test]# [ -e "/etc/haha" ] # 判断/etc/haha文件是否存在[root@localhost test]# echo $?1[root@localhost test]# [ -f "/etc" ] # 判断/etc是否为普通文件[root@localhost test]# echo $?1[root@localhost test]# [ -x "/bin/bash" ] # 判断/bin/bash是否可执行[root@localhost test]# echo $?0nginx 安装脚本优化,判断是否已安装 nginx[root@localhost test]# vim install_nginx.sh#!/bin/bashif [ -e "/usr/local/nginx" ];then # -e:判断nginx软件目录是否存在echo "nginx is install!" # 存在则输出一条nginx已安装的提示信息exit 1 # 输出完已安装信息则退出脚本else # 若nginx软件目录不存在,则执行如下命令yum -y install gcc gcc-c++ make pcre-devel openssl-devel wgetcd /usr/local/src/wget 'http://nginx.org/download/nginx-1.22.1.tar.gz'tar xf nginx-1.22.1.tar.gzcd nginx-1.22.1./configure --prefix=/usr/local/nginxmake -j 4&& make installln -s /usr/local/nginx/sbin/nginx /usr/bin//usr/local/nginx/sbin/nginxfi:wq[root@localhost test]# sh ./install_nginx.sh
(6)与或判断

判断多个条件

多个条件其中一个成立,或

多个条件都要成立,与

或运算判断:|| 或,两个条件满足其一即可,还有-o

与运算判断:&& 与,两个条件都得满足才行,还有-a

1、或运算判断
 [root@localhost test]# vim huo.sh#!/bin/bashread -p "请输⼊字符串:" nameif [ "$name" == "haha" ]||[ "$name" == "hehe" ];then # 这两个条件需满足其一,也可使⽤[ "$name" =="haha" -o "$name" == "hehe" ]echo "$name is my want"else echo "in else"fi:wq[root@localhost test]# sh ./huo.sh请输⼊字符串:hahahaha is my want[root@localhost test]# sh ./huo.sh请输⼊字符串:hehehehe is my want[root@localhost test]# sh ./huo.sh请输⼊字符串:lalain else
2、与运算判断
 [root@localhost test]# vim yu.sh#!/bin/bashread -p "请输⼊⼀个数值:" ageif [ $age -gt 30 ]&&[ $age -lt 80 ];then # 这两个条件都得满足,大于30且小于80,可使用[ $age -gt 30 -a $age -lt 80 ]echo "age>30 and age<80"echo "working"else echo "in else"fi :wq[root@localhost test]# sh ./yu.sh请输⼊⼀个数值:60age>30 and age<80working[root@localhost test]# sh ./yu.sh请输⼊⼀个数值:90in else
3、混合判断
 [root@localhost test]# vim hun.sh#!/bin/bashread -p "请输⼊⼀个数值:" ageif [ $age -gt 2 ]&&[ $age -lt 10 ]||[ $age -eq 100 ];then # 先做||前面的与判断,再进行或判断,可使⽤[ $age -gt 2 -a $age -lt 10 -o $age -eq 100 ]echo "age is>2 and age is <10 or age ==100 "else echo "in else"fi:wq[root@localhost test]# sh ./hun.sh请输⼊⼀个数值:7age is>2 and age is <10 or age ==100[root@localhost test]# sh ./hun.sh请输⼊⼀个数值:100age is>2 and age is <10 or age ==100[root@localhost test]# sh ./hun.sh请输⼊⼀个数值:30in else
(7)多重判断语法 elif

1、if 多分支语句结构

 if 条件1; then#命令,条件1成⽴执⾏elif 条件2;then#命令,条件1不成⽴,条件2成⽴执⾏elif 条件3;then#命令,条件1不成⽴,条件2不成⽴,条件3成⽴执⾏else#命令 ,以上条件都不成⽴执⾏fi

2、测试

 [root@localhost test]# vim fs.sh#!/bin/bash#分数等级评定read -p "请输⼊您的分数(0-100):" fsif [ $fs -ge 0 -a $fs -lt 60 ];thenecho "$fs分,不及格!"elif [ $fs -ge 60 -a $fs -lt 70 ];thenecho "$fs分,及格!"elif [ $fs -ge 70 -a $fs -lt 85 ];thenecho "$fs分,良好!"elif [ $fs -ge 85 -a $fs -le 100 ];thenecho "$fs分,优秀!"else echo "您输⼊的分数有误!"fi :wq[root@localhost test]# sh ./fs.sh请输⼊您的分数(0-100):2020分,不及格![root@localhost test]# sh ./fs.sh请输⼊您的分数(0-100):8585分,优秀![root@localhost test]# sh ./fs.sh请输⼊您的分数(0-100):7070分,良好![root@localhost test]# sh ./fs.sh请输⼊您的分数(0-100):123您输⼊的分数有误!
(8)多重判断的 case 语句
1、case 语句概述

case 语句是多分支选择语句

使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值执行不同 的命令序列,case还支持正则。

2、case 语句的结构
 case $变量名称 in模式1)命令序列1;;模式2)命令序列2;;*)默认命令序列esac
3、测试
                                  实例:  提示用户输入一个字符,判断该字符是字母、数字或者其他字符的脚本[root@localhost test]# vim hitkey.sh#!/bin/bash#击键类型识别read -p "请输⼊⼀个字符,并按Enter键确认:" keycase $key in[a-z]|[A-Z]) # a到z或A到Z,当变量输入为字母则执行下面的echo命令echo "您输⼊的是⼀个 字⺟";; [0-9])  # 0到9,当变量输入为数字则执行下面的echo的命令echo "您输⼊的是⼀个 数字";;*) # 若变量输入为空格等其他符号字符,则执行下面的echo命令echo "您输⼊的是 空格、功能键或其他控制字符";;esac:wq[root@localhost test]# sh ./hitkey.sh请输⼊⼀个字符,并按Enter键确认:5您输⼊的是⼀个 数字[root@localhost test]# sh ./hitkey.sh请输⼊⼀个字符,并按Enter键确认:b您输⼊的是⼀个 字⺟[root@localhost test]# sh ./hitkey.sh请输⼊⼀个字符,并按Enter键确认:P您输⼊的是⼀个 字⺟[root@localhost test]# sh ./hitkey.sh请输⼊⼀个字符,并按Enter键确认:!您输⼊的是 空格、功能键或其他控制字符实例: 输入分数变量,然后判定等级脚本[root@localhost test]# vim fscase.sh#!/bin/bash#使⽤case语句编写分数等级评定脚本read -p "请输⼊您的分数(0-100):" fscase $fs in[0-9]|[0-5][0-9]) # 0到9或59以内的两位数echo "$fs分,不及格!";;6[0-9]) # 6开头的两位数,若$fs输入为0,则判定为60,即执行下面的echo命令echo "$fs分,及格!";;7[0-9]|8[0-5]) # 以7开头的两位数或以8开头的两位数echo "$fs分,良好!";;8[6-9]|9[0-9]|100) # 以8开头的两位数,第二位最少为6,也就是最小是86 | 以9开头的两位数 | 100echo "$fs分,优秀!";;*) # 输入不在上述规则内的其他字符,则echo如下命令echo "您输⼊的分数有误!"esac:wq[root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):55分,不及格![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):5858分,不及格![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):6969分,及格![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):7070分,良好![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):8989分,优秀![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):100100分,优秀![root@localhost test]# sh ./fscase.sh请输⼊您的分数(0-100):110您输⼊的分数有误!

下午

1、循环语法

(1)for循环
1、作用

读取不同的变量值,以逐个执行同一组命令

2、结构
 for 变量名 in 取值列表(范围)do命令序列done

取值列表:数字范围、字符串、多个字符串、提前设定好的变量等

for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理

分隔成几段就循环几次

3、分隔值循环
 [root@localhost test]# vim quzhi.sh#!/bin/bashfor home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一次do echo "$home 是个好地⽅!"done:wq[root@localhost test]# bash quzhi.sh北京 是个好地⽅!上海 是个好地⽅!⼴州 是个好地⽅!深圳 是个好地⽅!实例:    判断包是否已安装[root@localhost test]# vim 2.sh#!/bin/bashfor softpack in wget gcc pcre pcre-devel zlib zlib-develdosoft_result=$(rpm -qa $softpack)if [ -z "$soft_result" ];thenyum install -y $softpackelseecho "$softpack is installed"fidone[root@localhost test]# bash 2.shwget is installedgcc is installedpcre is installedpcre-devel is installedzlib is installedzlib-devel is installed
4、在命令结果中循环
 [root@localhost test]# vim 1.sh#!/bin/bashx=1for user in $(awk -F':' '{print $1}' /etc/passwd) # 在/etc/passwd文件中以用户名作为循环do echo "第 $x ⽤户名称为: $user"let x=x+1done echo "该系统有 $(($x-1)) 个⽤户":wq[root@localhost test]# bash 1.sh第 1 ⽤户名称为: root...省略部分内容第 45 ⽤户名称为: yunjisuan第 46 ⽤户名称为: apache第 47 ⽤户名称为: nginx该系统有 47 个⽤户实例:   检测某个网段的存活主机[root@localhost test]# vim ping.sh#!/bin/bashfor IP in $(echo 192.168.33.{100..120}) # 192.168.33网段的100到120的主机,在此循环doping -c 2 -i 0.1 $IP &> /dev/nullif [ $? -eq 0 ];thenecho "Host $IP is up."fidone:wq[root@localhost test]# bash ping.shHost 192.168.100.100 is up.Host 192.168.100.101 is up.
(2)while循环
1、作用

重复测试某个条件,只要条件成立则反复执行

2、结构
 while 条件测试操作do命令序列done
3、while 和 if区别

while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出

if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出

*4、测试
 批量添加用户创建时交互输入用户前缀、创建用户个数、初始密码、过期时间(可选设置),用户首次登陆强制要求修改密码[root@localhost test]# vim useradd.sh # 批量创建⽤户脚本#!/bin/bashread -p "请输⼊创建⽤户的名称前缀:" QZread -p "请输⼊创建⽤户的个数:" NUMread -p "请输⼊⽤户的初始密码:" PSi=1while [ $i -le $NUM ]douseradd $QZ$iecho "$PS" | passwd --stdin $QZ$i &> /dev/nullchage -d 0 $QZ$ilet i++done:wq[root@localhost test]# bash useradd.sh请输⼊创建⽤户的名称前缀:admin请输⼊创建⽤户的个数:5请输⼊⽤户的初始密码:123456[root@localhost test]# tail /etc/passwdsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinyunjisuan:x:1000:1000:yunjisuan:/home/yunjisuan:/bin/bashapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologinnginx:x:975:974:Nginx web server:/var/lib/nginx:/sbin/nologinadmin1:x:1001:1001::/home/admin1:/bin/bashadmin2:x:1002:1002::/home/admin2:/bin/bashadmin3:x:1003:1003::/home/admin3:/bin/bashadmin4:x:1004:1004::/home/admin4:/bin/bashadmin5:x:1005:1005::/home/admin5:/bin/bash批量删除用户[root@localhost test]# vim userdel.sh # 批量删除⽤户脚本#!/bin/bashread -p "请输⼊要删除⽤户的前缀:" QZread -p "请输⼊要删除⽤户的个数:" NUMi=1while [ $i -le $NUM ]douserdel -r $QZ$ilet i++done :wq[root@localhost test]# bash userdel.sh请输⼊要删除⽤户的前缀:admin请输⼊要删除⽤户的个数:5
(3)循环的 break 和 continue

break直接结束循环,循环立即退出

continue可以用来跳过一次循环,跳过后循环继续,直到循环停止

 [root@localhost test]# vim test.sh#!/bin/bashfor line in 北京 上海 ⼴州 深圳do echo $lineif [ "$line" == "上海" ];then # 循环到上海⽴即退出breakfi done:wq[root@localhost test]# bash test.sh北京上海[root@localhost test]# vim test.sh#!/bin/bashfor line in 北京 上海 ⼴州 深圳doif [ "$line" == "上海" ];thencontinuefiecho $linedone:wq[root@localhost test]# bash test.sh北京⼴州深圳
(4)九九乘法表
 [root@localhost test]# vim 99.sh#!/bin/bash#九九乘法表for i in {1..9};dofor j in {1..9};doecho -n "$j*$i=$(($i*$j)) "if [ $j == $i ];thenecho -e '\n'breakfidonedone:wq[root@localhost test]# bash 99.sh1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81[root@localhost test]# vim 99-2.sh#!/bin/bash#九九乘法表i=1while [ $i -le 9 ];doj=1while [ $j -le 9 ];doecho -n "$j*$i=$(($i*$j)) "if [ $j -eq $i ];thenecho -e '\n'breakfilet j++donelet i++done:wq[root@localhost test]# bash 99-2.sh1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

2、sed流式编辑器

(1)概述

sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现增删改查的功能。

sed 依赖于正则表达式。

1、格式

sed 选项 “(定位符)指令” 文件名

(定位符)指令---想对文件的哪一行进行操作

2、选项
-e指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略
-n屏蔽默认输出 //不加选项-n默认先全文打印再执行命令打印所要求内容
-i直接修改源文件,不输出结果
-r支持扩展正则
3、行号定位
 [root@localhost day04]# sed "2p" /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6::1 localhost localhost.localdomain localhost6 localhost6.localdomain6加上-n不全文打印[root@localhost day04]# sed -n "2p" /etc/hosts::1 localhost localhost.localdomain localhost6 localhost6.localdomain6打印第三行[root@localhost day04]# sed -n "3p" /etc/passwddaemon:x:2:2:daemon:/sbin:/sbin/nologin打印一到三行[root@localhost day04]# sed -n "1,3p" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin打印第一行和第三行[root@lib ~]# sed -n '1p;3p' ifcfg-ens33 TYPE=EthernetBROWSER_ONLY=no打印奇数行 (行数从1开始每次自加2)[root@localhost day04]# sed -n "1~2p" /etc/passwd打印偶数行 (行数从2开始每次自加2)[root@localhost day04]# sed -n "2~2p" /etc/passwd打印第二行以及后面相邻的三行 (行数,+数字)---表示行数以及后面相邻的数字行[root@localhost day04]# sed -n "2,+3p" /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4、正则定位

基本正则

扩展正则

Perl兼容的正则

 sed可以使用正则匹配需要数据然后编辑数据过滤出现root开头的行[root@localhost day04]# sed -n "/^root/p" /etc/passwd过滤三位数[root@localhost day04]# sed -rn "/[0-9]{3}/p" /etc/passwd
(2)sed修改配置
p(print)打印(输出)
d(delete)删除(整行)
s(substitution)替换关键字(字符串匹配)
c(replace)替换行(整行)
r(read)读取指定文件(追加到行后)| 导入文件(追加到行后)
a(append)追加到指定内容到行后
i (insert)追加指定内容到行前
w(write)写入文件 | 导出文件
=打印行号
 [root@lib ~]# sed -i '4d' ifcfg-ens33     //删除第四行[root@lib ~]# sed -i '3aBOOTPROTO="dhcp"' ifcfg-ens33     //将指定内容追加到第三行后面    [root@lib ~]# sed -i '/dhcp/ s/dhcp/none/g' ifcfg-ens33    //定位到dhcp的一行,并将dhcp换为none
(3)sed命令引用变量

1、sed命令使用单引号的情况下,可以使用 '"$var"' 引用(单引号,然后 双引号,变量):

 sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml

2、sed命令中使用双引号的情况下,直接 shell command 或者 $(shell command) 引用命令执行。

 sed -i "2s/node_base/$i/" /etc/libvirt/qemu/$i.xml
(4)练习
 配置一个自动设置静态ip以及关闭selinux服务  关闭防火墙服务 关闭NetworkManager 修改主机名称的脚本  ip和主机名称使用read输入     //uuidgen为重新生成一个uuid
 [root@lib ~]# vim server.sh#!/bin/bashread -p "现在请输入一个你想要的ip地址:" ipsed -i 's/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33sed -i '$a IPADDR='"$ip"'\nNETMASK=255.255.255.0\nGATEWAY=10.0.0.2\nDNS1=8.8.8.8\nDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33sed -i '/UUID/c UUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33systemctl stop firewalldsystemctl disable firewalldsystemctl stop NetworkManagersystemctl disable NetworkManagersetenforce 0read -p "现在请输入你想要的主机名:" hostnamehostnamectl set-hostname $hostnameecho "注意:在重启后用户名才会生效,重启命令为reboot"[root@lib ~]# source server.sh 现在请输入一个你想要的ip地址:10.0.0.200setenforce: SELinux is disabled现在请输入你想要的主机名:hh注意:在重启后用户名才会生效,重启命令为reboot[root@lib ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=ens33UUID=b3234856-4ff2-42bc-bb28-34deced3b945DEVICE=ens33ONBOOT=yesIPADDR=10.0.0.200NETMASK=255.255.255.0GATEWAY=10.0.0.2DNS1=8.8.8.8DNS2=114.114.114.114

相关文章:

  • 111111111
  • OWASP top 10之XSS和csrf
  • 电脑如何进行录屏?电脑录屏无压力!
  • 前端开发知识(一)-html
  • 动静资源的转发操作
  • day18homework
  • SpringBoot3:轻松使用Jasypt实现配置文件信息加密
  • DDoS 攻击下的教育网站防护策略
  • ansible基础讲解和加密文件讲解
  • 机器学习数学基础(2)--最大似然函数
  • 免杀笔记 -->API的整理Shellcode加密(过DeFender)
  • 初学MySQl简单sql语句(1)
  • google、windows自带语音识别中英文等实时字幕使用
  • 跨境电商独立站:Shopify/Wordpress/店匠选哪个?
  • Linux常用命令整理
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android框架之Volley
  • Apache Spark Streaming 使用实例
  • CAP 一致性协议及应用解析
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Druid 在有赞的实践
  • ES6 学习笔记(一)let,const和解构赋值
  • k8s 面向应用开发者的基础命令
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node-glob通配符
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • spark本地环境的搭建到运行第一个spark程序
  • vue脚手架vue-cli
  • 阿里云Kubernetes容器服务上体验Knative
  • 翻译--Thinking in React
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 三栏布局总结
  • hi-nginx-1.3.4编译安装
  • Prometheus VS InfluxDB
  • 选择阿里云数据库HBase版十大理由
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​马来语翻译中文去哪比较好?
  • ​香农与信息论三大定律
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #图像处理
  • (11)MATLAB PCA+SVM 人脸识别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Python第六天)文件处理
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (三)docker:Dockerfile构建容器运行jar包
  • (原)本想说脏话,奈何已放下
  • (转)Linux下编译安装log4cxx
  • .Family_物联网
  • .htaccess配置常用技巧
  • .NET构架之我见
  • .NET学习教程二——.net基础定义+VS常用设置
  • [AIGC] 使用Curl进行网络请求的常见用法