shell脚本编程(3)——函数及中断控制、字符串处理、变量初始值处理
这一章主要写的是shell的函数及中断控制、字符串处理、变量初始值处理,能够快速了解shell脚本中的一些常用的技能,能够快速掌握shell中的一些快捷功能(* ^ - ^ *)
文章目录
一、函数及中断控制
1、关于函数的认识
- 什么是shell函数
– 在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即为函数 - 使用函数的好处
– 使脚本代码更简洁、增强易读性
– 提高shell脚本的执行效率 - 服务脚本中的函数应用
– 适用于比较复杂的启动/终止控制操作
– 方便在需要时多次调用
2、函数的定义与调用
-
函数的格式:2种
-
函数的调用
– 调用已定义的函数 (先定义了才能调用,就好比脚本的“内部命令”)
格式:函数名– 函数传值 (传递的值作为函数的“位置参数”)
格式:函数名 值1 值2 … …
函数使用案例1: 测试一个网段的IP是否ping通,ping通输出“IP is up”,不通输出“IP is down”
[root@svr5 ~]\# vim myping.sh
#!/bin/bash
xixi(){
ping -c1 -W1 $1 &>/dev/null //-W 指超时间隔,毫秒
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
xixi 192.168.4.$i &
done
wait //wait命令的作用是等待所有后台进程都结束才结束脚本。
函数使用案例2: shell版fork炸弹(递归死循环,可迅速耗尽系统资源,慎用)
[root@svr5 ~]\# vim test.sh
#!/bin/bash
.() //定义一个名为 . 的函数
{ //函数块开始
.|.& //在后台递归调用函数 .
} //函数块结束
; //与下一条执行行语句的分隔
. // 再次调用函数
3、中继及退出
- 中断、退出、继续的相关指令
类型 | 含义 |
---|---|
break | 跳出当前所在的循环体,执行循环体后的语句块 |
continue | 跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环 |
exit | 退出脚本,默认的返回值为0 |
- 三种用法案例:
break 案例: 随意输入整数(0结束)并求和,输出最终结果
[root@svr5 ~]\# vim break.sh
#!/bin/bash
SUM=0 // 定义SUN=0
while : //将所有指令循环
do
read -p "请输入整数(0表示结束):" x
[ $x -eq 0 ] && break
//当输入x为0,则结束循环
SUM=$[SUM+x]
//计算每个变量的和
done
echo "总和是:$SUM"
continue 案例: 找出1~2000范围内的6的倍数,不是6的倍数跳过
[root@svr5 ~]\# vim continue.sh
#!/bin/bash
for i in {1..2000}
do
x=$[i%6]
[ $x -ne 0 ] && continue
echo $[i]
done
exit: 案例: 利用位置参数获取2个整数,计算出这两个整数的和,如果参数不够2个,则提示正确用法并退出脚本
[root@svr5 ~]\# vim exit.sh
#!/bin/bash
if [ $# -ne 2 ];then
echo "用法:$0 num1 num2"
exit 10 //退出脚本,返回值设为10
fi
expr $1 + $2
二、 字符串处理
1、子串截取
- 格式:${变量名:起始位置 :长度}
- 起始位置,默认从0开始,可以省略
[root@svr5 ~]\# phone="13788768897"
[root@svr5 ~]\# echo ${phone:0:6}
137887
或
[root@svr5 ~]\# echo ${phone::6}
137887
- 使用${}方式截取字符串时,起始位置是从0开始的
子串截取案例: 在62个字符里输出一个8位随机的密码
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 //所有密码的可能性是26+26+10=62(0-61是62个数字)
pass=''
for i in {1..8}
do
num=$[RANDOM%62] //RANDOM获取随机数
tmp=${x:num:1} //得到1个随机字符
pass=${pass}$tmp //不断将得到的字符保存在pass中
done
echo $pass // 8次循环之后,得到随机字符串
2、子串替换(两种用法)
- 只替换第一个匹配结果:${变量名/old/new}
a=123
echo ${a/1/2} 将1替换为2
a=112233
echo ${a/1/2} 将1替换为2,只替换1次
- 替换全部匹配结果:${变量名//old/new}
a=111222333
echo ${a//1/2}
echo ${a/11/22}
a=112233
echo ${a//1/} //将所有的1换为空
3、插头去尾
- 从左向右,最短匹配删除:${变量名*关键词}
- 从左向右,最长匹配删除:${变量名##*关键词}
- 从右向左,最短匹配删除:${变量名%关键词*}
- 从右向左,最长匹配删除:${变量名%%关键词*}
案例1: 以上的每个情况
[root@svr5 ~]\# A=`head -1 /etc/passwd`
[root@svr5 ~]\# echo $A //定义一个变量
root:x:0:0:root:/root:/bin/bash
1、[root@svr5 ~]\# echo ${A#*:}
x:0:0:root:/root:/bin/bash //删除从左侧第1个字符到最近的关键词“:”的部分,
2、[root@svr5 ~]\# echo ${A##*:}
/bin/bash //删除从左侧第1个字符到最远的关键词“:”的部分:
3、[root@svr5 ~]\# echo ${A%:*}
root:x:0:0:root:/root //删除从右侧最后1个字符到往左最近的关键词“:”的部分,
4、[root@svr5 ~]\# echo ${A%%:*}
root //删除从右侧最后1个字符到往左最远的关键词“:”的部分:
案例2: 批量修改当前目录下的文件扩展名,将.doc改为.txt。
#!/bin/bash
#使用移动文件方法修改后缀名:
for i in `ls *.txt` //找到所有txt文件,交给for循环
do
n=${i%.*} //去掉扩展名,留下文件名
mv $i $n.doc //将原始文件改为文件名+.doc
done
#改良后:想要的参数,执行脚本时,输入参数即可
#!/bin/bash
for i in `ls *.$1`
do
n=${i%.*}
mv $i $n.$2
done
综合案例3: 执行脚本后,输入整数x,求从1到x的和;
当用户未输入值(直接回车)时,为了避免执行出错,应为x赋初值1
#!/bin/bash
read -p "请输入一个正整数:" x
x=${x:-1}
i=1; SUM=0
while [ $i -le $x ]
do
let SUM+=i
let i++
done
echo "从1到$x的总和是:$SUM"
四、变量初始值处理
1、初值的检测及设置
- $ {x :- y} :- 当x变量存在并为非空时 输出x值,否则输出字符串y
- 取值 ${x:-30}
- 当变量x存在时并且值为非空,则输出$x的值
- 当变量X不存在或者为空的时候,则输出字符串30
案例:
[root@sver5~]\# x=10
[root@sver5~]\# echo ${x:-haha}
10 //变量x定义了值则输出x值
[root@sver5~]\# unset x
[root@sver5~]\# echo ${x:-haha}
haha //变量x未定义值,则输出提供的字符串
案例:输入一个正整数x ,求1~x的和,若用户未输入值,则赋初始值x=1 ,b避免执行出错
[root@sver5~]\# vim sumx.sh
#!/bin/bash
read -p "请输入一个正整数:" x
x=${x:-1}
i=1;SUM=0
while [ $i -le $x ]
do
let SUM+=i
let i++
done
echo "从1到$x的总和是:$SUM"
[root@zwk ~]\# ./sumx.sh
请输入一个正整数:10
从1到10的总和是:55
[root@zwk ~]\# ./sumx.sh
请输入一个正整数:222
从1到222的总和是:24753
[root@zwk ~]\# ./sumx.sh
请输入一个正整数:100000
从1到100000的总和是:5000050000
结束啦
这篇的基本介绍就先写到这里,后面会继续更新shell脚本的一些常用的用法以及后面企业中一些实用的shell脚本的运用,感谢你们的浏览,也希望对你们有所帮助,你的点赞是我努力的动力,谢谢你们!