函数
个人理解的函数,是将实现某一功能的代码块抽离封装以实现代码的复用
函数定义
#函数定义格式
[function] 函数名 [()]
{
代码块
[return int;]
}
注:
(1)此处中括号代表可选,即用户可以以下几种方式进行函数定义
#!/bin/bash
f1()
{
echo "你好"
}
function f2
{
echo "世界"
}
function f3()
{
echo "hello world"
}
f1
f2
f3
运行后效果如图所示:
(2)return用于结束一个函数return后代码不执行;return语句可以不加,不加以最后一条命令运行结果作为返回值;return后跟数值范围为0-255
不带return的示例如下:
#!/bin/bash
#实现两个数相加
add()
{
y=$(($1+$2))
echo "a与b相加的和为 ${y}"
}
#赋值
read -p '请依次输入a,b的值(中间以空格分隔):' a b
#调用函数且传递参数
add ${a} ${b}
#输出函数返回值
echo $?
运行效果如下:
带return的示例如下:
#!/bin/bash
add()
{
y=$(($1+$2))
echo "a与b相加的和为 ${y}"
return ${y}
}
read -p '请依次输入a,b的值(中间以空格分隔):' a b
add ${a} ${b}
echo $?
运行效果如下:
(3)函数内普通声明的变量作用于脚本全局,若想其只在函数内起作用在变量名前加local即可
简单示例如下:
#!/bin/bash
a()
{
a=1
local b=2
}
a=3
b=4
echo "调用函数前a为${a},b为 ${b}"
a
echo "调用函数a后a为${a},b为${b}"
运行效果如下:
拓:可将函数定义到用户环境变量(vi ~/.bashrc)中以直接调用。
简单示例如下:
- 第一步修改文件:
- 第二步使文件在当前窗口生效
- 第三步调用函数即可
函数调用
- shell窗口调用
第一步使相关函数文件生效:
source 函数所在文件名
第二步调用:
#不传递参数
函数名
#传递参数
函数名 参数1 参数2 参数3
- 脚本内调用
函数名
注:函数定义必须写在函数调用前否则会找不到该函数,此处可做如下理解A问B认不认识C,B已经告诉了A不认识,然后C又告诉了B他叫C;用户可自行理解一句话概括就是函数定义就是我告诉你我是谁且我能干什么,函数调用就是通过函数名使用该函数
- 调用另一脚本中函数
第一步使其生效:
#在脚本中编写source或.命令
source 函数所在文件名
第二步调用:
#不传递参数
函数名
#传递参数
函数名 参数1 参数2 参数3
简单示例如下:
source 与. 两种执行方式无差别,source即为.
正则
正则表达式(Regular Expression、regex或regexp,缩写为RE)是一种字符模式,用于查找过程中匹配指定的字符。许多语言支持正则,如python,java等(模糊查询)
linux中支持正则表达式的程序有find、vi、grep、sed、awk
相关名词解释如下:
- 元字符——在正则表达式中具有特殊意义的字符:点(.)、星(*)、问号(?)
- 前导字符——位于元字符前一字符
常用元字符
示例文本(1.txt)内容如下:
gle
gooogle
taobao.com
taotaobaobao.com
jingdong.com
dingdingdongdong.com
10.1.1.1
192.168.21.133
hello world
helloworld yourself
示例1——o出现0次或多次的行
示例2——匹配g后不限长度字符
示例3——匹配行首为g的行
示例4——匹配行中包含a,b,ab,ba的行
其他元字符
注:表格中所有\符号用户均可理解为转义字符
示例1——取单词头为h的行
示例2——取单词尾为world的行
示例3——取单词hello所在的行
示例4——匹配文件中连续出现两个数字的行
示例5——匹配文件中的ip地址
示例6——vi模式下将192.168.21.133替换为192.168.21.122
示例7——匹配数字
扩展元字符
以下表中扩展元字符均需在grep -E或egrep模式下使用
示例1——匹配一个或多个o出现的行,且o在g后
示例2——匹配行中出现a或b的行
示例3——匹配出现helloworld或hiworld的行
示例4——匹配出现1-4次o的行
示例1——显示数字行