美文网首页
case语句 、 函数及中断控制 、 字符串处理

case语句 、 函数及中断控制 、 字符串处理

作者: 秋天丢了李姑娘 | 来源:发表于2021-06-07 19:48 被阅读0次

一,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 没有执行权限"

相关文章

网友评论

      本文标题:case语句 、 函数及中断控制 、 字符串处理

      本文链接:https://www.haomeiwen.com/subject/pdhreltx.html