case语句 、 函数及中断控制 、 字符串处理
=============================================
while
while 条件测试 //根据条件的结果决定是否要执行任务,条件测试成功的话就执行,如果失败立刻结束循环
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
--------------------------------------------------------
case
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
#!/bin/bash case $1 in start|kai) //输入start或者kai 就开启nginx /usr/local/nginx/sbin/nginx;; stop|STOP|s|guan) //输入stop或STOP或s或guan就关闭nginx /usr/local/nginx/sbin/nginx -s stop;; re|cq) //输入re或者cq就重启nginx /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx;; cx|status) //输入cx或者status就查询nginx状态 netstat -ntulp | grep -q nginx //查询nginx,但不输出结果 -q选项是保持沉默 [ $? -eq 0 ] && echo "nginx正在运行" || echo "nginx未开启";; //判断,如果上述任务成功,说明nginx服务开启,就显示"nginx正在运行",如果上述任务失败,说明nginx服务关闭,就显示"nginx未开启" *) echo "请输入start或stop" 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 start|kai) /usr/local/nginx/sbin/nginx;; stop|STOP|s|guan) /usr/local/nginx/sbin/nginx -s stop;; re|cq) /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx;; cx|status) netstat -ntulp | grep -q nginx [ $? -eq 0 ] && a 32 "nginx正在运行" || a 31 "nginx未开启";; *) echo "请输入start或stop" esac
-----------------------------------------------------------
循环的控制
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"
-------------------------------------------------------------
字符串的处理
字符串的截取
${:} [root@proxy opt]# a=abcd [root@proxy opt]# echo ${a:1:2} //从第二位截取两位 bc [root@proxy opt]# echo ${a:0:2} //从头截取两位 ab
注意该脚本用到以下思路:
[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
-----------------------------------------------------------------------------
字符串处理
字符串删除
a=abcdabcd //定义变量为素材 echo ${a#*c} //从左往右删除到第1个c echo ${a##*c} //从左往右删除到最后1个c echo ${a%b*} //从右往左删除到第1个b echo ${a%%b*} //从右往左删除到最后1个b
定义变量初值(备用)
${变量名:-初值} #!/bin/bash read -p "请输入用户名:" u [ -z $u ] && echo "必须输入用户名!" && exit useradd $u read -p "请输入密码(默认123456):" n echo ${n:-123456} | passwd --stdin $u
------------------------------------------------------
练习:
1,简述case分支结构。
2,简述定义一个Shell函数的方法。
3,简述Shell环境常见的中断及退出控制指令。
4,使用 while 循环,统计 1+2+3+4...+100的结果。
提示:可以用一个独立的变量a存放求和的值。
5,编写脚本,通过 3 个 read 命令读取用户输入的三个任意数字,脚本对输入的三个数字求和输出。
6, 编写脚本,测试当前用户对/etc/passwd 文件是否具有读、写、执行的权限,让脚本执行结果类似下面的效果。
参考答案:
1,简述case分支结构。
case 变量名 in
模式1)
执行指令 ;;
模式2)
执行指令 ;;
*)
执行指令
esac
2,简述定义一个Shell函数的方法。
函数名() {
执行指令
}
3,简述Shell环境常见的中断及退出控制指令。
break:跳出当前所在的循环,执行循环之后的语句。
continue:跳过循环内余下的语句,执行下一次循环。
exit:退出脚本
4,使用 for 循环,统计 1+2+3+4...+100的结果。
提示:可以用一个独立的变量a存放求和的值。
#!/bin/bash
a=0
for i in {1..100}
do
let a+=i
done
echo $a
5,编写脚本,通过 3 个 read 命令读取用户输入的三个任意数字,脚本对输入的三个数字求和输出。
#!/bin/bash
read -p "请输入数字" num1
read -p "请输入数字" num2
read -p "请输入数字" num3
echo $[num1+num2+num3]
6, 编写脚本,测试当前用户对/etc/passwd 文件是否具有读、写、执行的权限,让脚本执行结果类似下面的效果。
当前用户对/etc/passwd 有读权限
当前用户对/etc/passwd 有写权限
当前用户对/etc/passwd 无执行权限
#!/bin/bash
file=/etc/passwd
[ -r /etc/passwd ] && echo "当前用户对$file 有读权限" || echo "当前用户对$file 没有读权限"
[ -w /etc/passwd ] && echo "当前用户对$file 有写权限" || echo "当前用户对$file 没有写权限"
[ -x /etc/passwd ] && echo "当前用户对$file 有执行权限" || echo "当前用户对$file 没有执行权限"