第10章 函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.     定义和使用函数

定义函数的格式:

name ()

{

   command-list;

}

调用函数的格式:

name  #省略括号

2.     检查函数定义和取消函数定义

查看到所声明的函数定义:

 declare –f name

 

取消定义的函数,可以使用unset命令:

unset name

3.     参数和返回数据

案例:

#!/bin/bash


#定义函数printMsg用来输出信息到终端屏幕,该函数至少需要两个参数
printMsg()
{
      #如果参数个数小于两个,打印错误信息并且退出状态为1
 if [ $# -lt 2 ]
 then
       echo "printMsg() need 2 or more arguments..."

#使用return语句退出函数的执行,并制定退出状态
return 1
 fi
 
 #保存第一个参数值
 PREFIX="$1"
 
 #在参数列表中去除第一个参数
 shift
 
 #以参数1、参数2、参数3、参数4的形式打印出参数列表
 echo "$PREFIX:$@"
 #函数执行到这里会以最后一个命令的退出状态退出
}


#定义函数logMsg用来记录信息到log文件,该函数至少可以接收一个参数
logMsg()
{
      #判断是否制定了参数的另一种方式,查看第一个参数是否为空
 if [ -n "$1" ]
 then 
       #如果参数不为空,把日期和参数列表输出到log文件中
echo "`date` $@" >> ./arguments.log
 else 
            #如果参数为空,输出错误信息并让函数以退出状态1返回
            echo "logMsg() needs some arguments." 
            return 1
 fi


}


#通过两个参数调用函数printMsg,如果函数以非零值退出,才会调用logMsg函数
#由于指定了足够的参数,printMsg函数会返回成功值0,所以logMsg不会被调用
printMsg "From printMsg()" "it works..." "aabbcc" && logMsg "From logMsg()" "it works...."


注意:

  1 如果定义的函数名与bash内建的命令相同,则这个函数会覆盖内建命令。

4.     变量的作用域

本地变量:在函数内部所定义的变量只能在函数内部使用。变量前加了local

全局变量:可以在脚本内任何地方使用。

 

解读:为了程序不混乱,尽量使用本地变量,命名更具有描述性。

5.     递归调用

递归调用:函数调用本身。

案例:

#!/bin/bash


#定义计算阶乘的函数recursive,它接收一个参数
recursive()
{
      #如果指定的参数为数字1,则直接返回结果1
 if [ $1 - eq 1 ]
 then 
      echo "1"
  
  #函数以状态0返回
  return 0
 fi
 
 #定义本地变量TEMP,其中保存了参数值减1后的值
 local TEMP=`expr $1 -1`
 #在recursive的函数体内递归调用函数recursive本身
 #指定变量TEMP作为调用函数的参数
 #使用命令替换的方式调用函数,就像执行一个普通命令一样
 local PREVIOUS=`recursive $TEMP`
 
 #把数值($1减1)的阶乘计算结果和参数值$1相乘
 #特殊字符星号*需要被引用,才能正确地传递给expr命令
 RESULT=`expr $1 \* $PREVIOUS`
 
 #输出数值$1的阶乘计算结果
 echo $RESULT
 
 #退出状态0表示计算成功
 return 0
}


#提示用户输入整数值做阶乘运算,数值小于20是为了防止计算结果超出变量存储范围
echo 
echo -n " Enter a number (<20) to do n! operation (type "quit" to exit): "
read INPUT


#当用户输入字符串quit时,until循环结束,脚本退出
until [ "$INPUT" = "quit" ]
do 
      #对输入数据进行匹配
 case $INPUT in
 
 #合法的输入可以是1到9的个位数,或者是10到19的两位数,还可以是20
 [1-9]|[1][0-9]|20)
 
       #调用递归函数并保存计算结果
OUTCOME=`recursive "$INPUT"`
echo "  After computing,$INPUT!=$OUTCOME"
echo
;;
 
 #对所有不合法的输入进行匹配
 *)
       echo
echo " Not a valid number,Enter again!"
;;
 esac
 
 #为下一次阶乘运算读取用户输入的数据
 echo -n " Enter a number(<20) to do n!operation (type "quit" to exit):"
       read INPUT
done


echo 
echo " Bye."
exit 0


6.     函数库

函数库:指的是将通用的函数先定义好一个脚本,方便其他脚本调用。

 

注意:

 1 不要以#!/bin/bash开始库文件,同时给库文件添加可执行权限

 2 要在脚本文件的一开始执行库文件

 

案例:

库文件:   

#!/bin/echo       Warning:this is a library which should be sourced!
#上面一行的作用是防止库文件被意外执行


#定义函数test_platform用来测试当前的操作系统
test_platform(){
      #在本地变量osname中保存当前的操作系统
 local osname=`uname -s`
 
 #定义全局变量PLATFORM,并初始化为UNKOWN
 PLATFORM=UNKNOWN
 
 #根据当前的操作系统指定变量PLATFORM的值
 case ${osname} in
       "FreeBSD" in
         PLATFORM="FREEBSD"
       ;;
"SunOS"
         PLATFORM="SUNOS"
       ;;
"Linux"
         PLATFORM="LINUX"
       ;;
 esac
 
 return 0
}


 脚本:

#!/bin/bash


#首先在脚本程序中包含进库文件library.lib从而可以调用其中定义的函数
source ./library.lib 


#调用函数库中的函数test_platform
test_platform


#输出函数test_platform中定义的全局变量PLATFORM
echo
echo "Our running platform is $PLATFORM"


exit 0


 

【Go】全局日志处理、按天生成日志文件、格式化日志输出 golang中,通过中间件实现全局日志处理并输出到文件、文件按天生成。自定义实现格式化日志输出。 阅读详情

相关推荐

vxWorks中的logMsg机制的实现

vxWorks中打印时可以使用log_msg来进行打印,当然了这是系统启动后才可以使用的。 这其实就是定义了一个全局的信息队列,当调用log_msg时,信息就写入到这个队列中,然后相关的信息就会被打印出来。 先看一下这个队列被实现的函数调用: usrRoot-->logInit STATUS logInit ( int fd, /*信息被

行善之人必有余庆 4433

Vxworks中printf()和logMsg()的区别

Vxworks中printf()和logMsg()的区别 请问在Vxworks系统中,printf()和logMsg()的本质区别? 为什么在调试状态下printf()有可能引起阻塞,而logMsg不会呢 谢谢!  printf( ) - write a formatted string to the standard output stream (ANSI). logMsg

9178

Linux与VxWorks:printk与logMsg的设计差异

Linux的printk提供了更高的灵活性和可定制性,支持多种输出级别和格式控制,并且可以将日志信息输出到不同的目标和进行存储。它只提供了一个输出级别,即常规信息。为了满足不同需求的系统,Linux提供了一些配置选项,可以在运行时动态地调整printk的行为,如输出级别和缓冲区大小。本文将重点探讨它们在日志记录方面的设计差异,具体涉及到两个关键函数:Linux中的printk和VxWorks中的logMsg。此外,VxWorks没有内置的日志缓冲区,每条日志消息都会立即输出,无法进行后续的分析和调试。

CyberGenius的博客 573

10 函数

函数表达式、函数声明及箭头函数 ❑ 默认参数及扩展操作符 ❑ 使用函数实现递归 ❑ 使用闭包实现私有变量

LBJ辉的前端天地 646

10 初等函数

Labview的应用范围十分广泛,使用过程中免不了需要运用数学计算的知识,本文主要介绍基本的初等函数。以上就是今天要讲的内容,本文仅仅简单介绍了Labview几种初等函数。参考《Labview2018从入门到精通实战案例版》

weixin_43475125的博客 1247

《第10 函数

一、理解参数 在使用function 关键字定义(非箭头)函数时,可以在函数内部访问 arguments 对象,从中取得传进来的每个参数值 如果函数使用箭头语法定义的,那么传给函数的参数将不能使用arguments 关键字访问,而只能通过定义的命名参数访问。 二、函数内部 属性名称 内容 arguments arguments 是一个类数组对象,包含调用函数时传入的所有参数 this 在标准函数中,this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为this 值(在网

qq_47240379的博客 131

10 内置函数总结

10 内置函数总结 Greenplum数据库支持内置函数和操作符,包括可以在窗口表达式中使用的分析函数和窗口函数。 有关使用内置Greenplum数据库函数的信息,请参阅“Greenplum数据库管理员指南”中的“使用函数和操作符”。 •Greenplum数据库功能类型 •内置函数和操作符 •窗口功能 •高级分析功能

kygoal的博客 368

第九十 SQL函数 LOG10

目录第九十 SQL函数 LOG10大纲参数描述示例 第九十 SQL函数 LOG10 标量数值函数,它返回给定数值表达式的以 10 为底的对数。 大纲 {fn LOG10(expression)} 参数 expression - 数值表达式。 LOG10 返回 NUMERIC 或 DOUBLE 数据类型。如果表达式为 DOUBLE数据类型,则 LOG10 返回 DOUBLE;否则,它返回 NUMERIC。 描述 LOG10 返回表达式的以 10 为底的对数值。LOG10 返回一个精度为 21、小

yaoxin521123的博客 1534

10:LUA的函数

Lua 编程语言函数定义格式如下:end。

南京北辰网络科技工作室官方账号 418

《Kotlin从小白到大牛》第10函数

10 函数 程序中反复执行的代码可以封装到一个代码块中,这个代码块模仿了数学中的函数,具有函数名、参数和返回值,这就是函数。 Kotlin中的函数很灵活,它可以独立于类或接口之外存在,即顶层函数,也就是全局函数,之前接触的main函数就属于顶层函数;也可以存在于别的函数中,即局部函数;还可以存在于类或接口之中,即成员函数。 本重点介绍Kotlin函数基础内容,而高阶函数函数类型将在第14详细介绍。 10.1 函数声明 要使用函数首先需要声明函数,然后在需要的地方进行调用。函数的语法格式如下: f

weixin_38072116的博客 443

10 单行函数

10 单行函数 可以将函数广泛的分为单行函数和多行函数 select * from test3 order by tnum desc select bdz_id, shebei_id, shebei_name, user_id from tf_dev_ctrl where bdz_id = &BDZID order by bdz_id, user_id des...

weixin_30340775的博客 106

C语言-第10-函数

目录10.1 函数基础10.1.1 函数的定义、调用10.1.2 函数的声明10.1.3 没有返回值的函数和没有输入的函数10.1.4 return语句10.1.5 函数的嵌套调用10.1.6 常见问题10.1.7 函数的案例10.1.8 数组作为函数的参数10.1.9 递归10.2 原理10.3 多文件情况10.4 宏 10.1 函数基础 10.1.1 函数的定义、调用 函数定义的语法 ...

cb_east的博客 1488

10:深入函数

1:普通函数的重载:重载的是参数的类型 成员函数的重载:重载的是参数的类型 2:普通函数的缺省参数(默认参数)以及成员函数的缺省参数(默认参数)重载的是参数的数值 3:重载构造函数: 4:成员变量初始化:在函数体中进行赋值或者在构造函数头进行初始化(常量和引用只能初始化不能进行赋值) 5:成员变量初始化与构造函数:一个类的成员列表可以包含另一个类的对象 6:复制构造函数:参数为类对象的

u013681344的专栏 373

Python从小白到大牛 — 第10 函数式编程

10.1 定义函数 官方提供的函数叫内置函数(Built-in Functions,BIF)。 def 函数名(参数列表): 函数体 return 返回值 10.2 函数参数 10.2.1 使用关键字参数调用函数 10.2.2 参数默认值 10.2.3 可变参数 10.3 函数返回值 10.3.1 无返回值函数 10.3.2 多返回值函数 10.4 函数变量作用域 10.5 生成器 10.6...

大叔小py 479
上一篇: 第9章 引用
下一篇: 第11章 其他常用工具
wer0735
博客等级 码龄14年 159粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值