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个参数 //$#的结果,执行脚本时,输入了多少参数 (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 $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