一,while循环,可以根据条件决定循环次数,也可以实现无限循环
while 条件测试 //根据条件的结果决定是否要执行任务,条件测试成
功的话就执行,如果失败立刻结束循环
while=循环
sleep=让它多少时间去执行一次
do
任务
done
--------------------------------
#!/bin/bash
while : //冒号代表永远正确
do
echo abc
sleep 0.1 //休息0.1秒
done
-----------------------------------
#!/bin/bash
n=10
while [ $n -ge 5 ] //可以根据条件决定是否要循环
do
echo abc
sleep 0.1
let n-- //每次循环将n-1
Done
二,循环的控制
exit 可以终止循环,但脚本也终止
break 可以终止循环,继续循环后的任务
continue 可以终止当前循环,继续下一次循环
编写脚本,帮用户进行整数求和,如果用户输入0
就结束求和,并输出结果
#!/bin/bash
x=0
while : //while循环后面写冒号代表永远正确可以无限循环
do
read -p "请输入一个整数求和(0是结束并输出结果):" n
[ -z $n ] && continue //如果n是空值则重新进行循环任务
[ $n -eq 0 ] && break //如果n是0则退出循环执行循环后任务
let x+=n //不断的将n的值保存在x里
done
echo "总和是$x"
三,case分支,功能类似if,编写时语句比if精简
case 调用的变量名 in
模式1)
指令;;
模式2)
指令;;
*)
指令
esac
----------------------------
#!/bin/bash
case $1 in
t) //如果$1是t就执行touch任务
touch $2;;
m) //如果$1是m就执行mkdir任务
mkdir $2;;
r) //如果$1是r就执行rm任务
rm -rf $2;;
*)
echo "请输入t或者m或者r"
esac
------------------------------
nginx 是搭建网站的服务
编写源码安装nginx脚本:
tar -xf lnmp_soft.tar.gz //在家目录释放软件包,这个软件包是从真机获取的
cp lnmp_soft/nginx-1.17.6.tar.gz /opt //拷贝nginx到opt下
cd /opt //回opt写下列脚本
#!/bin/bash
yum -y install gcc make pcre-devel openssl-devel //安装依赖软件
tar -xf nginx-1.17.6.tar.gz //释放nginx的tar包
cd nginx-1.17.6 //进入目录
./configure //配置
make //编译
make install //安装
脚本写完后,检查yum必须可用!
运行完脚本后,查看 ls /usr/local/nginx 目录可以看到
4个目录则成功 conf html logs sbin
systemctl stop httpd //关闭httpd避免端口冲突
/usr/local/nginx/sbin/nginx //开启nginx服务
systemctl stop firewalld //关闭防火墙
使用浏览器访问虚拟机的网站页面http://192.168.2.5/ 这个地址要按照自己虚拟机的写
/usr/local/nginx/sbin/nginx -s stop //关闭nginx
netstat 命令可以查询系统启动的端口信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
-----------------------------------------------------------
使用case分支编写控制nginx服务的脚本:
#!/bin/bash
case $1 in
kai)
/usr/local/nginx/sbin/nginx;;
guan)
/usr/local/nginx/sbin/nginx -s stop;;
cq)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
cx)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo "nginx正在运行" || echo "没有运行";;
*)
echo "使用";;
esac
echo -e "\033[34mABCD\033[0m" //使用echo输出不同颜色的内容
四,函数,可以利用一个名称存储公共的语句块,实现
精简脚本方便后期调用的目的
函数名(){
指令
}
------------------------
a(){ //创建函数
echo abc
echo xyz
}
a //调用函数
a //可以反复调用函数
使用函数修改字符颜色
#!/bin/bash
a(){ //创建函数,名字叫a
echo -e "\033[$1m$2\033[0m" //输出带颜色的字符
}
a 31 ABCD //调用函数时,后面跟第一个位置变量定义颜色
第二个位置变量定义内容
a 32 xyzZ
a 33 EGSD
a 34 ERTY
a 35 BJYQ
利用函数完善之前的脚本,使输出信息时有不同颜色
#!/bin/bash
a(){
echo -e "\033[$1m$2\033[0m"
}
case $1 in
kai)
/usr/local/nginx/sbin/nginx;;
guan)
/usr/local/nginx/sbin/nginx -s stop;;
cq)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
cx)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && a 32 "nginx正在运行" || a 31 "没有运行";;
*)
a 5 "使用";;
esac
五,字符串的处理
- 字符串的截取
${变量名称:截取位置:截取长度}
[root@proxy opt]# a=abcd
[root@proxy opt]# echo ${a:1:2} //从第二位截取两位
bc
[root@proxy opt]# echo ${a:0:2} //从头截取两位
ab
编写脚本,可以生成8位随机字符用作密码
注意该脚本用到以下思路:
[root@proxy opt]# c=a$c //首先准备一个变量c作为口袋可以装字符
这里装了一个字符a
[root@proxy opt]# echo $c //看看口袋里
a
[root@proxy opt]# c=6$c //再往口袋里装一个字符6
[root@proxy opt]# echo $c //再看看,口袋里字符越来越多
6a
[root@proxy opt]# c=t$c //再装个字符t
[root@proxy opt]# echo $c //字符又增加了
t6a
之后开始写脚本:
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
for i in {1..8}
do
n=$[RANDOM%62] //得到0~61随机数存在变量n中
a=${x:n:1} //截取到1个随机字符,存在变量a中
c=$a$c //不断往c中追加,此时c相当于一个袋子
done
echo $c //最后喊出,得到8位长度随机字符串
- 字符串替换
${变量名/旧/新}
a=1234
echo ${a/2/6} //将1个字符2换成6
a=112233
echo ${a/2/6} //将1个字符2换成6
echo ${a//2/6} //将所有字符2换成6
a=1122233
echo ${a/22/66} //换2个
echo ${a/11/} //将11替换成空,相当于删除
- 字符串的删除,可以删除两边
${变量名#要删除的内容} 掐头
${变量名%要删除的内容} 去尾
a=abcdef //创建变量,作为素材
echo ${a#abc} //掐头,删除到abc
echo ${a%def} //去尾,删除到def
echo ${a#abcde} //掐头,删除到abcde
a=abcdefghijk //创建变量,作为素材
echo ${a#abcdefghi} //掐头,删除到i
echo ${a#*i} //效果同上,精简写法
echo ${a%defghijk} //去尾,删除到d
echo ${a%d*} //效果同上,精简写法
编写脚本,可以批量修改扩展名
可以先用touch abc{01..10}.txt 创建10个文件作为素材
#!/bin/bash
for i in $(ls *.txt) //找到所有的txt文件交给for循环
do
n=${i%.*} //用去尾的方法删除扩展名
mv $i $n.doc //再将源文件扩展名修改为doc
done
二,正则表达式,可以使用若干符号配合某工具对字符串进行
增删改查操作
head -5 /etc/passwd > user //准备素材
grep ^root user //找以root开头的行
grep bash$ user //找以bash结尾的行
grep ^$ user //找空行
grep -v ^$ user //显示除了空行的内容
grep "[root]" user //找r、o、t任意一个字符
grep "[rot]" user //效果同上
grep "[^rot]" user //显示r或o或t以外的内容
grep "[0123456789]" user //找所有数字
grep "[0-9]" user //效果同上
grep "[^0-9]" user //显示数字以外内容
grep "[a-z]" user //找所有小写字母
grep "[A-Z]" user //找所有大写字母
grep "[a-Z]" user //找所有字母
grep "[^0-9a-Z]" user //找所有符号
grep "." user //找任意单个字符,文档中每个字符都可
以理解为任意字符
grep "r..t" user //找rt之间有2个任意字符的行
grep "r.t" user //找rt之间有1个任意字符的行,没有匹
配内容,就无输出
grep "*" user //错误用法,*号是匹配前一个字符任意
次,不能单独使用
grep "ro*t" user //找rt,中间的o有没有都行,有几次都行
grep ".*" user //找任意,包括空行 .与*的组合在正则中相当
于通配符的效果
grep "ro\{1,2\}t" user //找rt,中间的o可以有1~2个
grep "ro\{2,6\}t" user //找rt,中间的o可以有2~6个
grep "ro\{1,\}t" user //找rt,中间的o可以有1个以及1个以上
grep "ro\{3\}t" user //找rt,中间的o必须只有有3个
sed 增删改查 . 流式编辑器
非交互式对文档增删改查
前置指令 | sed 选项 条件 指令
选项 -n 屏蔽默认输出 -r 支持扩展正则 -i 修改源文件
指令 p 输出 d 删除 s 替换