一,while循环
while 条件测试
do
执行指令
done
如果条件测试成功,就执行下面的指令,然后再回来继续看条件测试能否成功,如果成功就继续执行指令,且可以实现无限循环,一旦发现条件测试失败了,就立刻终止循环
#!/bin/bash
while : //直接写冒号表示永远正确的条件测试
do
echo abc
sleep 0.1 //如果系统执行任务消耗cpu比较多,可以每次稍微休息0.1秒
done
#!/bin/bash
n=20
while [ $n -gt 10 ] //可以根据条件定义有次数的循环
do
echo $n
let n-- //每次将n减去1
echo abc
sleep 0.1
done
二,case分支,功能类似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"
esac
编写源码安装nginx脚本:
[root@svr7 ~]# tar -xf lnmp_soft.tar.gz //释放软件包,这个软件包是从真机获取的
[root@svr7 ~]# cp lnmp_soft/nginx-1.17.6.tar.gz /opt //拷贝nginx到opt下
[root@svr7 ~]# 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 #进入nginx目录
./configure #配置,此处无需定义安装目录
make #编译
make install #安装
[root@svr7 ~]# ls /usr/local/nginx/ //脚本执行完后查看有四个目录则成功
[root@svr7 ~]# systemctl stop httpd //关闭其他网站服务
[root@svr7 ~]# systemctl stop firewalld //关闭防火墙
[root@svr7 ~]# /usr/local/nginx/sbin/nginx //开启nginx服务
[root@svr7 ~]# http://192.168.4.7/ //浏览器访问,可以看到nginx默认页面
使用case分支编写控制nginx服务的脚本:
#!/bin/bash
read -p "请输入执行指令:" a
case $a in
start|kai)
/usr/local/nginx/sbin/nginx;;
stop|guan)
/usr/local/nginx/sbin/nginx -s stop;;
*)
echo "请输入start|stop"
esac
netstat 命令可以查询系统启动的端口信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
#!/bin/bash
read -p "请输入执行指令:" a
case $a in
start|kai)
/usr/local/nginx/sbin/nginx;;
stop|guan)
/usr/local/nginx/sbin/nginx -s stop;;
restart|cq)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
status|zt)
netstat -ntulp | grep -q nginx
[ $? -eq 0 ] && echo "nginx正在运行" || echo "nginx未开启";;
*)
echo "请输入start|stop"
esac
echo -e "\033[34mABCD\033[0m" #使用echo输出不同颜色的内容
三,函数,可以使用名称存储公共的语句块,实现精简脚本方便后期调用的效果
#!/bin/bash
a(){ #定义函数,名称是a
echo abc
echo xyz
}
a #调用函数
利用函数完善之前的脚本,使输出信息时有不同颜色
#!/bin/bash
a(){
echo -e "\033[$1m$2\033[0m"
}
read -p "请输入执行指令:" a
case $a in
start|kai)
/usr/local/nginx/sbin/nginx;;
stop|guan)
/usr/local/nginx/sbin/nginx -s stop;;
restart|cq)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx;;
status|zt)
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"
五,字符串处理
1,字符串截取
${变量名称:截取位置:截取长度}
a=abcdefg
echo ${a:5:2} #从变量的第6位截取,截取2位
echo ${a:3:3} #从变量的第4位截取,截取3位
echo ${a:0:3} #从变量的第1位截取,截取3位
echo ${a::3} #上述的精简写法
编写脚本,可以生成8位随机字符
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
for i in {1..8} #循环8次
do
n=$[RANDOM%62] #得到0~61随机数存在变量n中
k=${x:n:1} #使用字符串截取得到1个随机字符,存在变量k中
a=$k$a #不断往变量a中追加
done
echo $a #喊出最终结果,是一个8位长度的随机字符,可以用作密码
2,字符串替换
${变量名称/旧/新}
[root@svr7 opt]# a=12345
[root@svr7 opt]# echo ${a/4/6}
12365
[root@svr7 opt]# a=1122334455
[root@svr7 opt]# echo ${a/4/6}
1122336455
[root@svr7 opt]# echo ${a//4/6}
1122336655
3,字符串删除
${变量名称#要删除的内容} 从左往右删除 掐头
${变量名称%要删除的内容} 从右往左删除 去尾
a=abcdefghijkl //定义变量作为素材
echo ${a#abcdefghij} //从左往右删除,只留下kl
echo ${a#*j} //精简写法,效果同上
echo ${a#def} //无法从中间删除
a=abcdefghijkl
echo ${a%defghijkl} //从右往左删除,只留下abc
echo ${a%d*} //精简写法,效果同上
a=abcdabcd
echo ${a#*c} //从左往右删除到第1个c
echo ${a##*c} //从左往右删除到最后1个c
a=abcdabcd
echo ${a%c*} //从右往左删除到第1个c
echo ${a%%c*} //从右往左删除到最后1个c
练习:
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,使用 while 循环,统计 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 没有执行权限"
网友评论