函数定义格式:

和js有点类似,不过在 shell 中 function 关键字是可选的。

如:

sum
{
// shell 语句
}

  

function sum()
{
// shell 语句
}

函数调用方法:

sum 参数1 参数2 ...

  

获取函数参数:

这个和我们以往的经验可能不太一样,shell 中获取函数参数的方式有点特别。

一般语言中,都是在函数名后面的括号中给定一个变量名去接收函数参数。

而在 shell 中,获取函数参数的方式是在函数体中使用美元符号加上数字获取,如 $1  获取第一个参数,$2 获取第二个参数,依次类推,但是大于或等于 10 的时候,$ 后面的数字要加上大括号,如 ${10}。

如:

sum()
{
echo $(($1 + $2))
}

  

与 $ 有关的其他参数:

参数处理 说明
$#   传递给函数的参数总个数
$*    以一个字符串显示所有的参数
$$    脚本运行的当前进程的ID号
$!  后台运行的最后的进程的ID号
$@  与$*相同,但是在使用时加引号,并在引号中返回每个参数
$-  显示 shell 使用的当前选项,如:我们使用 set -x 的时候,$- 中会包含 x
$?  显示上一条命令的退出状态,或者说是返回值,没有返回值并正常运行的时候会返回 0

  

如:

#!/bin/bash

funcA()
{
return 123
} sum()
{
echo "参数总个数: $#"
echo "字符串形式显示所有参数: $*"
echo "脚本运行的进程ID号: $$"
echo "字符串形式显示所有参数: $@"
echo "shell脚本运行的选项: $-"
funcA
echo "上一个语句的返回值: $?"
echo $(($1 + $2))
} sum 1 2

上面的代码会输出:

参数总个数: 2
字符串形式显示所有参数: 1 2
脚本运行的进程ID号: 1408
字符串形式显示所有参数: 1 2
shell脚本运行的选项: hB
上一个语句的返回值: 123
3

  

脚本中获取任意多的参数:

#!/bin/bash

sumMulti()
{
sum=0
while [ "$1" != "" ]
do
sum=$(($sum+$1))
shift
done
echo $sum;
} sumMulti 1 2 3 4 5

  

while 后面的中括号左右需要有空格,语法需要,书写格式没有一般语言自由,

并且赋值表达式的等号左右不能有空格,有空格的语句,shell会将第一个词作为 shell 命令,然后将第一个空格后面的任何内容当作 shell 命令的参数,这也是 shell 的独特之处,理解这一点对于 shell 的学习非常关键!如上面的 sum=0 如果写作 sum = 0,会提示诸如下面的内容:

sum: =: No such file or directory
sum: 0: No such file or directory

也就是说 shell 在运行这个语句的时候,实际上是把 sum 当作 shell 命令了(当然函数也可以这么调用)。

shift 的作用是将第一个参数从参数列表中移除。

获取函数返回值:

1、通过 return 获取返回值:

#!/bin/bash

sumMulti()
{
sum=0
while [ "$1" != "" ]
do
sum=$(($sum+$1))
shift
done
return $sum;
} sumMulti 1 2 3 4 5
echo "通过return获取返回值: $?"  

我们可以使用上面提到的 $? 获取上一个函数执行的返回值。

2、通过 echo 获取返回值:(原理: 我们可以使用反引号获取命令执行的输出内容)

#!/bin/bash

sumMulti()
{
sum=0
while [ "$1" != "" ]
do
sum=$(($sum+$1))
shift
done
echo $sum;
} sum=`sumMulti 1 2 3 4 5`
echo "通过echo获取返回值: $sum"

上面函数调用那一行也可以换做:两种写法差不多

sum=$(sumMulti 1 2 3 4 5)

  

  

shell函数使用的更多相关文章

  1. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  2. Shell入门教程:Shell函数的返回值

    shell函数返回值一般有3种方式: 1.return语句(默认的返回值) shell函数的返回值可以和其他语言的返回值一样,通过return语句返回. 比如: #!/bin/bash functio ...

  3. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...

  4. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  5. Shell函数的简单应用

    Shell函数的简单应用 在脚本内给函数传参: #!/bin/bash . /etc/init.d/functions CheckUrl (){ curl -I -s $ | head - } Che ...

  6. Shell函数语法

    Shell函数语法 定义函数: function   函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名  参数一   参数二 return在函数里面使用会跳出函数并 ...

  7. shell 函数

    1 shell函数的定义及其调用 shell函数有两种格式: function name { commands } name() { commands } 其中,name为函数名,commands为函 ...

  8. Shell函数:Shell函数返回值、删除函数、在终端调用函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...

  9. Shell函数返回值、删除函数、在终端调用函数

    Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] ...

  10. Linux Shell 函数返回值

    Shell函数返回值,常用的两种方式:return,echo 1) return 语句 shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回. 示例: #!/bin/sh fu ...

随机推荐

  1. Python中如何实现im2col和col2im函数(sliding类型)

    今天来说说im2col和col2im函数,这是MATLAB中两个内置函数,经常用于数字图像处理中.其中im2col函数在<MATLAB中的im2col函数>一文中已经进行了简单的介绍. 一 ...

  2. java之接口开发-初级篇-http和https

    http协议util address(url地址),str(数据参数) private static HttpMethod getPostJsonMethodInRequestBody(String ...

  3. XSS 注入检查点

    如果你有个论坛,一般你会很注意用户发帖的注入问题,往往这个地方不会被注入,因为开发特别照顾.原则上XSS都是用户输入的,但是许多边角还是容易忽略.枚举一些检查点. 分页 分页通用组件获取url,修改p ...

  4. 算法笔记(c++)--桶排序题目

    算法笔记(c++)--桶排序 记得题目是排序,输入n个1-1000的数字然后去重然后排序. 桶排序没毛病 #include<iostream> using namespace std; i ...

  5. Druid Monitor小记

    继上篇DruidDataSource源码分析之后 , 公司又要求做一个Druid的数据库监控 , 以及spring监控 , 研究一小时 , 总结出了一点经验 , 特此贴出来分享一下 一 . 利用Dru ...

  6. [转]C#学习笔记15——C#多线程编程

    一.基本概念进程:当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的.线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存 ...

  7. Scrum立会报告+燃尽图(十一月十六日总第二十四次):功能开发与设计页面

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2384 项目地址:https://git.coding.net/zhang ...

  8. snprintf vs sprintf

    #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char * ...

  9. RAR和ZIP:压缩大战真相 (挺赞值得了解)

    前言--王者归来? 等待足足两年之久,压缩霸主WinZip终于在万众期待下发布了9.0正式版.全世界自然一片沸腾,在世界各大知名下载网站中,WinZip9.0再次带起下载狂潮.然而此时国内并没有王者回 ...

  10. HDU 5207 Greatest Greatest Common Divisor

    题目链接: hdu:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=153598 bc(中文):http://bestco ...