7.26shell脚本编写

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.sh 或 sh helloword.sh )的主要区别在于,source 命令会在当前 shell 进程中执行脚本,脚本中定义的变量和对环境的更改会直接影响当前的 shell 环境。

 编写hello world输出脚本

[root@lib ~]#  vim helloword.sh
 #!/bin/bash
 echo "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/bash
 yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget
 cd /usr/local/src/
 wget 'https://nginx.org/download/nginx-1.24.0.tar.gz'
 tar -xf nginx-1.24.0.tar.gz
 cd nginx-1.24.0
 ./configure --prefix=/usr/local/nginx
 make -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/bash
 echo $1
 echo $2
 echo $3
 echo $4
 echo $5
 [root@lib ~]# source canshu.sh a b c d e
 a
 b
 c
 d
 e
 创建一个用户并为用户设置登录密码:
 [root@lib ~]# vim passwd.sh
 #!/bin/bash
 useradd $1
 echo $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 "$*"    //将所有参数整合到一起,总共列为一行
 do
      echo $x
 done
 [root@lib ~]# source 1.sh abc cde hhh 123
 abc cde hhh 123
 [root@lib ~]# vim 1.sh
 #!/bin/bash
 #将所有的脚本参数输出在终端
 for x in "$@"    //将所有参数单个列出,每个参数单列一行
 do
      echo $x
 done
 [root@lib ~]# source 1.sh abc cde hhh 123
 abc
 cde
 hhh
 123
 [root@lib ~]# vim 1.sh
 #!/bin/bash
 #将所有的脚本参数输出在终端
 #!/bin/bash
 for x in "$@"
 do
       echo $x
 done
 echo $?
 echo "该脚本是:$0"
 echo "此脚本⼀共处理了$#个参数"
 [root@web ~]# source 1.sh 1 2 3 4 
 1
 2
 3
 4
 0    //$?的结果,表示上个命令执行成功
 该脚本是:-bash    //-bash 是 shell 的提示符,表示等待您输入新的命令。
 此脚本⼀共处理了4个参数
 [root@web ~]# sh 1.sh 1 2 3 4 
 1
 2
 3
 4
 0
 该脚本是:1.sh     //$0的结果,也就是该脚本的名称
 此脚本⼀共处理了4个参数   //$#的结果,执行脚本时,输入了多少参数

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 $ip1
 192.168.100.100
 [root@localhost shell]# echo $ip2
 192.168.100.100
 [root@localhost shell]# x=100
 [root@localhost shell]# y=50
 [root@localhost shell]# z=`expr $x + $y` # 整数运算
 [root@localhost shell]# echo $z
 150
 [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 $y
 1 5
 [root@localhost shell]# vim ip.sh # 编写一个查看IP的脚本,内容如下
 #!/bin/bash
 read -p "请输⼊接⼝名称:" x # 输入x变量等于什么,脚本内不用写,命令行输入该变量x等于什么即可,该变量x可在脚本内引用
 ifconfig $x | grep -w inet | awk '{print $2}'     # grep -w inet 会在这些信息中精确匹配包含单词 inet 的行
 :wq
 [root@localhost shell]# sh ip.sh
 请输⼊接⼝名称:ens32
 192.168.100.100
 [root@localhost shell]# sh ip.sh
 请输⼊接⼝名称:lo
 127.0.0.1
 [root@localhost shell]# vim read.sh # 编写输入账号密码的脚本,内容如下
 #!/bin/bash
 read -p "请输⼊您的姓名:" name # 该变量name是在命令行输入的,相当于变量=值
 read -p "请输⼊您的密码:" passwd # 该变量passwd是在命令行输入的,相当于变量=值
 if [ $passwd = "123456" ]; then # if判断语句,如果(if)某某等于某某,那么(then)执行什么命令,否则(else)执行什么命令,结尾fi
  echo "你好,$name !"
 else
  echo "抱歉,您输⼊的密码不正确!"
 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 $s
 hh
 [root@lib ~]# vim 1.sh
 #!/bin/bash
 read -p "username:" username
 read -s -p "passwd:" passwd
 useradd $username
 echo $passwd | passwd --stdin $username
 if [ $? -eq 0 ] ; then
        echo "账户$useradd注册成功"
 else
        echo "注册失败"
 fi
 [root@lib ~]# source 1.sh 
 username:cc
 passwd:更改用户 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 $y
 bbb
(6)变量的数学运算
1、数学运算
在 Shell 脚本中,自定义变量的计算可以通过多种方式实现。

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

 num1=5
 num2=3
 result=`expr $num1 + $num2`
 echo $result
另一种常用的方式是使用 $(( )) 表达式。比如:

 num1=5
 num2=3
 result=$((num1 + num2))
 echo $result
此外,如果您使用的是 bash ,还可以使用 let 命令:

 num1=5
 num2=3
 let result=num1+num2
 echo $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" | bc
 1.10810
5、判断语法
(1)条件判断$?的应用
Shell的返回值:运行一条命令,都会有一个返回值。0代表执行正常,非0代表命令执行异常。

 [root@localhost test]# ls /
 bin dev home lib64 mnt proc run srv tmp var
 boot etc lib media opt root sbin sys usr
 [root@localhost test]# echo $? # $?保存了上条命令的返回值,0表示执行成功,非0表示执行失败
 0
 [root@localhost test]# ls /haha
 ls: ⽆法访问'/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/bash
 num1=3 # 给定变量num1
 num2=3 # 给定变量num2
 if [ $num1 -eq $num2 ];then # 判断num1变量是否等于num2
  echo "$num1 equal $num2" # 如果等于,那么执行命令,echo输出
 fi
 :wq
 [root@localhost test]# sh ./if.sh
 3 equal 3
 检测网络是否畅通脚本
 [root@localhost test]# vim ping.sh
 #!/bin/bash
 read -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/bash
 read -p "请输⼊账号:" name
 if [ "$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/bash
 read -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包:nginx
 nginx is not find!
 [root@localhost test]# sh ./rpm.sh
 请输⼊你要检测的rpm包:lrzsz
 lrzsz 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 $?
 0
 nginx 安装脚本优化,判断是否已安装 nginx
 [root@localhost test]# vim install_nginx.sh
 #!/bin/bash
 if [ -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 wget
  cd /usr/local/src/
  wget 'http://nginx.org/download/nginx-1.22.1.tar.gz'
  tar xf nginx-1.22.1.tar.gz
  cd nginx-1.22.1
  ./configure --prefix=/usr/local/nginx
  make -j 4&& make install
  ln -s /usr/local/nginx/sbin/nginx /usr/bin/
    /usr/local/nginx/sbin/nginx
 fi
 :wq
 [root@localhost test]# sh ./install_nginx.sh
(6)与或判断
判断多个条件

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

多个条件都要成立,与

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

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

1、或运算判断
 [root@localhost test]# vim huo.sh
 #!/bin/bash
 read -p "请输⼊字符串:" name
 if [ "$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
 请输⼊字符串:haha
 haha is my want
 [root@localhost test]# sh ./huo.sh
 请输⼊字符串:hehe
 hehe is my want
 [root@localhost test]# sh ./huo.sh
 请输⼊字符串:lala
 in else
2、与运算判断
 [root@localhost test]# vim yu.sh
 #!/bin/bash
 read -p "请输⼊⼀个数值:" age
 if [ $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
 请输⼊⼀个数值:60
 age>30 and age<80
 working
 [root@localhost test]# sh ./yu.sh
 请输⼊⼀个数值:90
 in else
3、混合判断
 [root@localhost test]# vim hun.sh
 #!/bin/bash
 read -p "请输⼊⼀个数值:" age
 if [ $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
 请输⼊⼀个数值:7
 age is>2 and age is <10 or age ==100
 [root@localhost test]# sh ./hun.sh
 请输⼊⼀个数值:100
 age is>2 and age is <10 or age ==100
 [root@localhost test]# sh ./hun.sh
 请输⼊⼀个数值:30
 in 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):" fs
 if [ $fs -ge 0 -a $fs -lt 60 ];then
  echo "$fs分,不及格!"
 elif [ $fs -ge 60 -a $fs -lt 70 ];then
  echo "$fs分,及格!"
 elif [ $fs -ge 70 -a $fs -lt 85 ];then
  echo "$fs分,良好!"
 elif [ $fs -ge 85 -a $fs -le 100 ];then
  echo "$fs分,优秀!"
 else 
  echo "您输⼊的分数有误!"
 fi 
 :wq
 [root@localhost test]# sh ./fs.sh
 请输⼊您的分数(0-100):20
 20分,不及格!
 [root@localhost test]# sh ./fs.sh
 请输⼊您的分数(0-100):85
 85分,优秀!
 [root@localhost test]# sh ./fs.sh
 请输⼊您的分数(0-100):70
 70分,良好!
 [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键确认:" key
 case $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):" fs
 case $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开头的两位数 | 100
  echo "$fs分,优秀!"
  ;;
  *) # 输入不在上述规则内的其他字符,则echo如下命令
  echo "您输⼊的分数有误!"
 esac
 :wq
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):5
 5分,不及格!
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):58
 58分,不及格!
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):69
 69分,及格!
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):70
 70分,良好!
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):89
 89分,优秀!
 [root@localhost test]# sh ./fscase.sh
 请输⼊您的分数(0-100):100
 100分,优秀!
 [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/bash
 for home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一次
 do 
  echo "$home 是个好地⽅!"
 done
 :wq
 [root@localhost test]# bash quzhi.sh
 北京 是个好地⽅!
 上海 是个好地⽅!
 ⼴州 是个好地⽅!
 深圳 是个好地⽅!
                                   实例:    判断包是否已安装
 [root@localhost test]# vim 2.sh
 #!/bin/bash
 for softpack in wget gcc pcre pcre-devel zlib zlib-devel
 do
  soft_result=$(rpm -qa $softpack)
  if [ -z "$soft_result" ];then
  yum install -y $softpack
  else
  echo "$softpack is installed"
  fi
 done
 [root@localhost test]# bash 2.sh
 wget is installed
 gcc is installed
 pcre is installed
 pcre-devel is installed
 zlib is installed
 zlib-devel is installed
4、在命令结果中循环
 [root@localhost test]# vim 1.sh
 #!/bin/bash
 x=1
 for user in $(awk -F':' '{print $1}' /etc/passwd) # 在/etc/passwd文件中以用户名作为循环
 do 
  echo "第 $x ⽤户名称为: $user"
  let x=x+1
 done 
 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/bash
 for IP in $(echo 192.168.33.{100..120}) # 192.168.33网段的100到120的主机,在此循环
 do
  ping -c 2 -i 0.1 $IP &> /dev/null
  if [ $? -eq 0 ];then
  echo "Host $IP is up."
  fi
 done
 :wq
 [root@localhost test]# bash ping.sh
 Host 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/bash
 read -p "请输⼊创建⽤户的名称前缀:" QZ
 read -p "请输⼊创建⽤户的个数:" NUM
 read -p "请输⼊⽤户的初始密码:" PS
 i=1
 while [ $i -le $NUM ]
 do
  useradd $QZ$i
  echo "$PS" | passwd --stdin $QZ$i &> /dev/null
  chage -d 0 $QZ$i
  let i++
 done
 :wq
 [root@localhost test]# bash useradd.sh
 请输⼊创建⽤户的名称前缀:admin
 请输⼊创建⽤户的个数:5
 请输⼊⽤户的初始密码:123456
 [root@localhost test]# tail /etc/passwd
 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
 tcpdump:x:72:72::/:/sbin/nologin
 yunjisuan:x:1000:1000:yunjisuan:/home/yunjisuan:/bin/bash
 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
 nginx:x:975:974:Nginx web server:/var/lib/nginx:/sbin/nologin
 admin1:x:1001:1001::/home/admin1:/bin/bash
 admin2:x:1002:1002::/home/admin2:/bin/bash
 admin3:x:1003:1003::/home/admin3:/bin/bash
 admin4:x:1004:1004::/home/admin4:/bin/bash
 admin5:x:1005:1005::/home/admin5:/bin/bash
 批量删除用户
 [root@localhost test]# vim userdel.sh # 批量删除⽤户脚本
 #!/bin/bash
 read -p "请输⼊要删除⽤户的前缀:" QZ
 read -p "请输⼊要删除⽤户的个数:" NUM
 i=1
 while [ $i -le $NUM ]
 do
  userdel -r $QZ$i
  let i++
 done 
 :wq
 [root@localhost test]# bash userdel.sh
 请输⼊要删除⽤户的前缀:admin
 请输⼊要删除⽤户的个数:5
(3)循环的 break 和 continue
break直接结束循环,循环立即退出

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

 [root@localhost test]# vim test.sh
 #!/bin/bash
 for line in 北京 上海 ⼴州 深圳
 do 
  echo $line
  if [ "$line" == "上海" ];then # 循环到上海⽴即退出
  break
  fi 
 done
 :wq
 [root@localhost test]# bash test.sh
 北京
 上海
 [root@localhost test]# vim test.sh
 #!/bin/bash
 for line in 北京 上海 ⼴州 深圳
 do
 if [ "$line" == "上海" ];then
  continue
 fi
  echo $line
 done
 :wq
 [root@localhost test]# bash test.sh
 北京
 ⼴州
 深圳

(4)九九乘法表

 [root@localhost test]# vim 99.sh
 #!/bin/bash
 #九九乘法表
 for i in {1..9};do
  for j in {1..9};do
  echo -n "$j*$i=$(($i*$j)) "
  if [ $j == $i ];then
  echo -e '\n'
  break
  fi
  done
 done
 :wq
 [root@localhost test]# bash 99.sh
 1*1=1
 1*2=2 2*2=4
 1*3=3 2*3=6 3*3=9
 1*4=4 2*4=8 3*4=12 4*4=16
 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
 1*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=1
 while [ $i -le 9 ];do
  j=1
  while [ $j -le 9 ];do
  echo -n "$j*$i=$(($i*$j)) "
  if [ $j -eq $i ];then
  echo -e '\n'
  break
  fi
  let j++
  done
  let i++
 done
 :wq
 [root@localhost test]# bash 99-2.sh
 1*1=1
 1*2=2 2*2=4
 1*3=3 2*3=6 3*3=9
 1*4=4 2*4=8 3*4=12 4*4=16
 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
 1*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/hosts
 127.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/passwd
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 打印一到三行
 [root@localhost day04]# sed -n "1,3p" /etc/passwd
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 打印第一行和第三行
 [root@lib ~]# sed -n '1p;3p' ifcfg-ens33 
 TYPE=Ethernet
 BROWSER_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/passwd
 bin:x:1:1:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 adm:x:3:4:adm:/var/adm:/sbin/nologin
 lp: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/bash
 read -p "现在请输入一个你想要的ip地址:" ip
 sed -i 's/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
 sed -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-ens33
 sed -i '/UUID/c UUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33
 systemctl stop firewalld
 systemctl disable firewalld
 systemctl stop NetworkManager
 systemctl disable NetworkManager
 setenforce 0
 read -p "现在请输入你想要的主机名:" hostname
 hostnamectl set-hostname $hostname
 echo "注意:在重启后用户名才会生效,重启命令为reboot"
 [root@lib ~]# source server.sh 
 现在请输入一个你想要的ip地址:10.0.0.200
 setenforce: SELinux is disabled
 现在请输入你想要的主机名:hh
 注意:在重启后用户名才会生效,重启命令为reboot
 

 [root@lib ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
 TYPE=Ethernet
 PROXY_METHOD=none
 BROWSER_ONLY=no
 BOOTPROTO=none
 DEFROUTE=yes
 IPV4_FAILURE_FATAL=no
 IPV6INIT=yes
 IPV6_AUTOCONF=yes
 IPV6_DEFROUTE=yes
 IPV6_FAILURE_FATAL=no
 IPV6_ADDR_GEN_MODE=stable-privacy
 NAME=ens33
 UUID=b3234856-4ff2-42bc-bb28-34deced3b945
 DEVICE=ens33
 ONBOOT=yes
 IPADDR=10.0.0.200
 NETMASK=255.255.255.0
 GATEWAY=10.0.0.2
 DNS1=8.8.8.8
 DNS2=114.114.114.114

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值