Linux shell之函数

声明与简介

Shell是系统的用户界面,它提供了用户跟内核进行交互的桥梁。Shell是一个命令解释器,它接收用户输入的命令并送到内核去执行。

本文主要介绍Shell里函数的常见使用方法。

使用函数

函数概述

函数shell脚本执行时的代码块,它实际上为了完成特定任务而构建出来的命令集。比如我们之前介绍的代码段可以定义在一个函数里,方面重复调用。

# 编写函数,读取当前文件pip_3.txt里的每一行内容并显示行号。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let num++
echo -e "文件$file的第$num行是:\t$line"
done < ./pip_3.txt
}
getcontent#调用及结果
./shell_ifs.sh
文件的第1行是:    Package Version
文件的第2行是:    attrs   19.3.0
文件的第3行是:    Automat 0.8.0
文件的第4行是:    boto3   1.10.28

定义和使用参数

#编写函数,读取当前文件指定文件里的每一行内容并显示行号。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let num++
echo -e "文件$file的第$num行为:\t$line"
done < $file
}
file=$1
getcontent#调用及结果
./shell_ifs.sh pip_3.txt
文件的第1行是:    Package Version
文件的第2行是:    attrs   19.3.0
文件的第3行是:    Automat 0.8.0
文件的第4行是:    boto3   1.10.28

返回控制

#编写函数,读取当前文件指定文件里的每一行内容并显示行号。这里读取到第3行即截止。
getcontent()
{
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $file
}
file=$1
getcontent#调用及结果
./shell_ifs.sh pip_3.txt
文件的第1行是:    Package Version
文件的第2行是:    attrs   19.3.0
文件的第3行是:    Automat 0.8.0
文件的第4行是:    boto3   1.10.28注:1 这里算数比较时如果用-eq方式,则中括号“[、]”两边都得有空格。
2 shell的if判断需要两个括号。

返回值结合判断

#对文件行数遍历,超过4行的打印行数并提示超过,反之则反。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let ++num;
done < $1
echo $num
return $num
}
#result=0
result=$(getcontent $1)
if (( $result > 4 ));then
echo "当前$result行超过4行"
else
echo "当前$result行小于等于4行"
fi#执行及结果
./del.sh pip_3.txt
当前4行小于等于4行
./del.sh emp.txt
当前18行超过4行

局部变量

# 通过局部变量方式访问文件。这里定义file变量为局部变量。#!/bin/bash
getcontent()
{
local num=0
local file=$1
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $file
}
getcontent $1# 调用及结果
./shell_ifs.sh pip_3.txt文件的第1行是:    Package Version
文件的第2行是:    attrs   19.3.0
文件的第3行是:    Automat 0.8.0
文件的第4行是:    boto3   1.10.28

函数式环境变量

我们知道环境变量一般是预定义的值,比如$JAVA_HOME。而函数也是可以定义在环境变量里的。

# 将获取文件行和内容的函数定义在环境变量里,直接在shell里输入函数的整体内容。
# Step1 定义函数
getfilecontent()
> {
> local num=0
> while read line
> do
> let ++num;
> echo -e "文件$file的第$num行是:\t$line";
> if ([ $num -eq 3 ]);then
> echo "结束在第三行"
> return
> fi
> done < $1
> }# Step2定义函数环境变量
export -f getfilecontent# Step3 子shell调用,比如在another.sh里定义如下:
#!/bin/bash
getfilecontent emp.txt#结果
./another.sh文件的第1行是:    7369,smith,clerk,7902,'1980-12-17',800,null,20
文件的第2行是:    7499,allen,salesman,7698,'1981-2-20',1600,300,30
文件的第3行是:    7521,ward,salesman,7698,'1981-2-22',1250,500,30
结束在第三行延展:
1 这种函数式环境变量仅在定义的shell内有效,其它shell无效。
./ another.sh:行3: getfilecontent: 未找到命令2 取消函数式环境变量的定义可通过unset命令
unset -f getfilecontent如果再次执行之前的shell则会报如下错:
./del.sh:行3: getfilecontent: 未找到命令3 查看函数式环境变量的定义,可通过env命令查看:

变量范围

# 局部变量仅作用于函数内,如果与全局变量重名,那么在函数内以局部变量为准。如下是示例代码。num既定义为全局变量又定义为局部变量,而函数体内以局部变量为准。getfilecontent()
{
local num=0
echo -e "num的值:\t $num"
#local file=$1
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $filename
}
filename=$1
num=10
getfilecontent
echo -e "num的值:\t $num"#调用及结果
./shell_ifs.sh emp.txt
num的值:   0
文件的第1行是:    7369,smith,clerk,7902,'1980-12-17',800,null,20
文件的第2行是:    7499,allen,salesman,7698,'1981-2-20',1600,300,30
文件的第3行是:    7521,ward,salesman,7698,'1981-2-22',1250,500,30
结束在第三行
num的值:   10

位置参数

位置参数即按照函数从左到右的顺序传递参数,一般有$1到$10,10个参数,如果超过10个,用${n}来代替,可通过循环遍历。

#位置参数的例子,见
#!/bin/bash
getfilecontent()
{
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\t$line";
if ([ $num -eq 3 ]);then
echo "结束在第三行"
return
fi
done < $1}
getfilecontent $1#调用及结果
./shell_ifs.sh demo.txt
文件的第1行是:    1 name
文件的第2行是:    2 addr
文件的第3行是:    3 school
结束在第三行

SET内置参数

#通过set设置内置参数#!/bin/bash
getfilecontent()
{
set ./demo.txt 2
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\t$line";
if ([ $num -eq $2 ]);then
echo "结束在第$2行"
return
fi
done < $1
}
num=10
getfilecontent $1 $2#调用与结果,未指定任何参数,使用内置的值。./shell_ifs.sh
文件的第1行是:    1 name
文件的第2行是:    2 addr
结束在第2行

递归调用

递归是一种函数的返回值作为输入反复调用的一种特殊函数。

#计算一个数的累加值。
#!/bin/bash
cal_add(){
if [ $1 -eq 1 ]
then
echo 1
else
local tmp=$(( $1 -1 ))
local result=$(cal_add $tmp)
echo $(( $result + $1 ))
fi
}
read -p "请输入一个数:" num
f=$(cal_add $num)
echo -e "数$num的累加值:\t $f"#执行及结果
./accuadd.sh
请输入一个数:3
数3的累加值:  6

你该认识这样的Linux_shell函数使用案例相关推荐

  1. ML之FE:pandas库中数据分析利器之groupby分组函数、agg聚合函数、同时使用groupby与agg函数组合案例之详细攻略

    ML之FE:pandas库中数据分析利器之groupby分组函数.agg聚合函数.同时使用groupby与agg函数组合案例之详细攻略 目录 pandas库中数据分析利器之groupby分组函数.ag ...

  2. Matlab:Matlab中常用的函数、案例详细攻略

    Matlab:Matlab中常用的函数.案例详细攻略 目录 常用函数 1.与文件相关 2.MATLAB GUI不同控件函数间变量传递方法 常用函数 Matlab中的bwmorph函数解释 bwmorp ...

  3. 写几个函数 输入10个职工的姓名和职工号_Excel函数速查一览表-函数应用案例-信息统计(2)...

    继续学习<Excel 2003函数应用完全手册>第四章,函数应用案例,今天看信息统计的第二部分. 使用Excel 管理人事信息,具有无须编程.简便易行的特点.假设有一个人事管理工作表,它的 ...

  4. python int函数的实现_python实现int函数的案例分析

    python实现int函数的案例分析 发布时间:2020-08-06 14:35:55 来源:亿速云 阅读:88 作者:小新 python实现int函数的案例分析?这个问题可能是我们日常学习或工作经常 ...

  5. 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)

    黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...

  6. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  7. oracle创建索引index,【学习笔记】Oracle索引 创建含sysdate的函数index案例

    天萃荷净 分享一篇运维DBA需求,创建含sysdate的函数index案例 1.模拟Oracle数据库环境 创建表插入数据库 [oracle@node1 ~]$ sqlplus chf/oraclep ...

  8. Oracle数据二进制传输,学习笔记:Oracle数值函数 十进制与二进制相互转换的函数使用案例...

    天萃荷净 ORACLE 十进制与二进制互转函数,开发DBA向我咨询数值转换的方法,Oracle数值转换函数NUMBER_TO_BIT等函数可用 1.Oracle数值转换之十进制转换二进制 CREATE ...

  9. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

最新文章

  1. C++数组名做函数形参/指针
  2. docker安装redis提示没有日记写入权限_Docker 学习笔记(第六集:使用 Dockerfile 定制镜像)...
  3. 《Eve: Valkyrie Warzone》发布,非VR玩家也能公平开战
  4. 对抽象工厂+反射+配置文件的实例理解
  5. office数据集dslr_DSLR的完整形式是什么?
  6. jQuery 缩放 旋转 裁剪图片 Image Cropper
  7. React组件的State
  8. mybatis xml sql
  9. c++拷贝构造之深拷贝
  10. ADO.Net(一)——增、删、改、查
  11. 小爱音箱怎么装app_小爱音箱最新版本下载  小爱音箱app介绍_2113手游
  12. php轻松入门视频教程,PHP轻松入门视频教程
  13. 安卓手机测评_鲁大师又在找事?一季度安卓系统流畅度排名出炉,小米MIUI吊车尾...
  14. 包装类和自动拆箱与自动装箱
  15. 服务器dns显示fec,服务器dns地址fec0
  16. fluent物性参数拟合多项式,python,matlab多项式图像绘制
  17. 内核网络协议栈offload功能盘点
  18. Windows事件查看器_ID一览表
  19. 开传奇技术去哪学?如何架设传奇?
  20. 核磁T1加权像和T2加权像的区别

热门文章

  1. wxWidgets:wxScrollEvent类用法
  2. boost::phoenix模块使用 BLL 和 boost::function 进行测试
  3. boost::mp11::mp_inherit相关用法的测试程序
  4. boost::hana::Comparable用法的测试程序
  5. boost::geometry::strategy::andoyer用法的测试程序
  6. GDCM:gdcm::StringFilter的测试程序
  7. GDCM:DICOM转储到DshibaDTI的测试程序
  8. Boost:compute::copy的复制数据测试程序
  9. OpenCV简单的过滤器平滑的实例(附完整代码)
  10. OpenCV基于均值漂移的跟踪的实例(附完整代码)