Linux shell编程学习笔记24:函数定义和使用

为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。

Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。

1 函数的定义

1.1 标准格式

function 函数名(){语句或命令1……语句或命令n[return 返回值]
}

其中:

  • function是 Shell 中的关键字,专门用来定义函数;
  • 由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
  • return 是 Shell 关键字,专门用在函数中返回一个值;如果不用返回值,这一句也可以不写。

这个格式是不是与JavaScript的函数定义格式很像?
 

1.2 简化格式

在实际实用中,还有两种简化格式:

1.2.1  简化格式1——省略function关键字

我们可以把function关键字省略不写,就有了下面这种简化格式:

函数名(){语句或命令1……语句或命令n[return 返回值]
}

1.2.2  简化格式2——省略函数名后面的小括号

如果我们写了 function 关键字,也可以省略函数名后面的小括号,就有了下面这种简化格式:

function 函数名{语句或命令1……语句或命令n[return 返回值]
}

1.3 建议

建议使用1.1的标准格式,保持与其它编程语言的书写兼容性。

2 函数的参数

2.1 函数在定义时不能指明参数

尽管Linux Linux Shell中的函数定义格式与JavaScript的函数定义格式很像,但它也在有自己的特别之处,那就是函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

2.2 函数体内使用参数信息的方式

函数体内脚本内获取参数的格式为:

${n}

其中n 代表一个数字,0为执行脚本的命令行命令, 1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,依此类推……

  • 当n > 10时,可以省略{},简写为$n。
  • 当n>=10时,务必使用${n}

除此之外,还有几个特殊的参数处理信息:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$-显示Shell使用的当前选项
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

3 函数的执行(调用)

格式:

函数名 [参数1 参数2 …… 参数n]

与JavaScript一样,Linux Shell 对函数定义和调用的顺序不做限制,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

但是,与JavaScript不同的地方:

  • 函数名后面不用()。
  • 如果要传递参数,那么参数以空格分隔。
  • 不管是哪种形式,函数名字后面都不需要带括号。

4.函数定义和调用实例

我们定义一个函数x:

function x()
{echo cmd: $0; echo param number:$#; echo they are $@; echo 1-$1; echo 2-${2}; echo 3-$3; echo 4-$4; echo 5-$5; echo 6-$6;echo 7-$7; echo 8-$8;echo 9-$9;echo 10-${10};return 0;
};

在函数体中,我们用echo命令首先显示命令行命令($0)

然后显示命令行参数个数($#)

接着我们显示所有的命令行参数($@)

然后我们逐个显示每个参数

最后我们用return语句返一个值0

4.1 bash中

csdn @edu bash $ function x() {echo cmd: $0; echo param number:$#; echo they are $@; echo 1-$1; echo 2-${2}; echo 3-$3; echo 4-$4; echo 5-$5; echo 6-$6;echo 7-$7; echo 8-$8; echo 9-$9; echo 10-${10}; return 0;}; x a1 b2 c3 d4 e5 f6 h7 i8 j9 k10; echo exit code: $?
bash: syntax error near unexpected token `{echo'
csdn @edu bash $ function x() { echo cmd: $0; echo param number:$#; echo they are $@; echo 1-$1; echo 2-${2}; echo 3-$3; echo 4-$4; echo 5-$5; echo 6-$6;echo 7-$7; echo 8-$8; echo 9-$9; echo 10-${10}; return 0;}; x a1 b2 c3 d4 e5 f6 h7 i8 j9 k10; echo exit code: $?
cmd: bash
param number:10
they are a1 b2 c3 d4 e5 f6 h7 i8 j9 k10
1-a1
2-b2
3-c3
4-d4
5-e5
6-f6
7-h7
8-i8
9-j9
10-k10
exit code: 0
csdn @edu bash $ 

在命令行中,我们先定义了函数x,然后调用函数x并参递了参数10个参数:

x a1 b2 c3 d4 e5 f6 h7 i8 j9 k10

最后我们使用命令

echo exit code: $?

显示函数x的返回值为0

在bash的命令行中,函数体开始的{和后面的命令或语句要用空格分隔。


4.2 zsh中

csdn @ edu zsh $ function x() {echo cmd: $0; echo param number:$#; echo they are $@; echo 1-$1; echo 2-${2}; echo 3-$3; echo 4-$4; echo 5-$5; echo 6-$6;echo 7-$7; echo 8-$8; echo 9-$9; echo 10-${10}; return 0;}; x a1 b2 c3 d4 e5 f6 h7 i8 j9 k10; echo exit code: $?
cmd: x
param number:10
they are a1 b2 c3 d4 e5 f6 h7 i8 j9 k10
1-a1
2-b2
3-c3
4-d4
5-e5
6-f6
7-h7
8-i8
9-j9
10-k10
exit code: 0

代码跟在bash中是一样的,但是zsh的命令行中不要求函数体开始的{和后面的命令或语句用空格分隔。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/168943.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)

员工分页查询和账号启用禁用功能 1. 员工分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 封装PageResult1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.4 代码完善 2. 启用禁用员工账号…

基于ubuntu22.04手动安装openstack——2023.2版本(最新版)的问题汇总

前言:基本上按照openstack官方网站动手可以搭建成功(如有需要私信发部署文档)。 但是任然有些小问题,所以汇总如下。 第一个问题 问题: ubuntu搭建2023.2版本neutorn报错,ERROR neutron.plugins.ml2.driv…

c++求三个数的最小公倍数

答案&#xff1a; #include <iostream> using namespace std; int main() {int n1, n2, n3, max;cin >> n1 >> n2 >> n3;max (n1 > n2 > n3) ? n1 : n2;do{if (max % n1 0 && max % n2 0 && max % n3 0){cout << ma…

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令&#xff0c;总结在此&#xff0c;后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…

第十三章《搞懂算法:神经网络是怎么回事》笔记

目前神经网络技术受到追捧&#xff0c;一方面是由于数据传感设备、数据通信技术和数据存储技术 的成熟与完善&#xff0c;使得低成本采集和存储海量数据得以成为现实;另一方面则是由于计算能力的大幅提升&#xff0c;如图形处理器(Graphics Processing Unit&#xff0c;GPU)在神…

VS c++多文件编译

前言&#xff1a;记录下我这个菜鸡学习的过程&#xff0c;如有错误恳请指出&#xff0c;不胜感激&#xff01; 1.简单多文件编译调试 文件目录&#xff1a; 编译&#xff1a; -g选项是告诉编译器生成调试信息&#xff0c;这样可以在程序崩溃或出现错误时更容易地进行调试。这…

图论11-欧拉回路与欧拉路径+Hierholzer算法实现

文章目录 1 欧拉回路的概念2 欧拉回路的算法实现3 Hierholzer算法详解4 Hierholzer算法实现4.1 修改Graph&#xff0c;增加API4.2 Graph.java4.3 联通分量类4.4 欧拉回路类 1 欧拉回路的概念 2 欧拉回路的算法实现 private boolean hasEulerLoop(){CC cc new CC(G);if(cc.cou…

19 异步通知

一、异步通知 1. 异步通知简介 阻塞和非阻塞两种方式都是需要应用程序去主动查询设备的使用情况。 异步通知类似于驱动可以主动报告自己可以访问&#xff0c;应用程序获取信号后会从驱动设备中读取或写入数据。 异步通知最核心的就是信号&#xff1a; #define SIGHUP 1 /* 终…

帝国cms中如何让外部链接直接从新窗口打开页面

<?php if($bqr[isurl]) { ?> <a href"<?$bqsr[titleurl]?>" target"_blank"> <?php } else { ?> <a href"<?$bqsr[titleurl]?>"> <?php } ?>

KCC@广州与 TiDB 社区联手—广州开源盛宴

10月21日&#xff0c;KCC广州与 TiDB 社区联手&#xff0c;在海珠区保利中悦广场 29 楼召开了一次难忘的开源盛宴。这不仅仅是 KCC广州的又一次线下见面&#xff0c;更代表着与 TiDB 社区及广州技术社区的首次深度合作。 活动的策划与组织由 KCC广州负责人 - 惠世冀、PingCAP 的…

Doris:多源数据目录(Multi-Catalog)

目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…