1 shell函数的定义及其调用

shell函数有两种格式

function name {

commands

}

name() {

commands

}

其中,name为函数名,commands为函数体中执行的语句块。定义函数后,可以简单地通过函数名name对其进行调用。

注:

如果出现两个同名的函数定义,那么后者会覆盖前者,而不是报错。

2 函数返回值

shell函数在运行结束时返回状态码,有三种方式:

1 默认情况下,返回函数中最后一条命令的状态码,可以用$?来获取函数的退出状态码

#! /bin/bash
# testing the exit status of a function
# function func1 {
echo "This is the first form of defining a function:"
ls -l badfile # badfile is not exist
} func2() {
echo "This is the second form of defining a function:"
date #
} echo "Testing the function and exit status"
echo
func1
echo "The exit status of func1 is: $?"
echo
func2
echo "The exit status of func2 is: $?" [root@benxintuzi shell]# ./35.sh
Testing the function and exit status This is the first form of defining a function:
ls: cannot access badfile: No such file or directory
The exit status of func1 is: 2 This is the second form of defining a function:
Tue Aug 11 22:43:48 PDT 2015
The exit status of func2 is: 0

2 使用return命令可以返回0~255之间的任意值

#! /bin/bash
# testing the exit status of a function
# func() {
read -p "Please enter a value: " value
echo "doubling the input value..."
return $[ $value * ]
} func
echo "The exit status of func is: $?" [root@benxintuzi shell]# ./36.sh
Please enter a value: 50
doubling the input value...
The exit status of func is: 100
[root@benxintuzi shell]# ./36.sh
Please enter a value: 200
doubling the input value...
The exit status of func is: 144

3 使用变量保存,这种方式不仅可以返回任意数值,还可以返回字符串值

#! /bin/bash
# testing the exit status of a function
# func() {
read -p "Please enter a value: " value
echo $[ $value * ]
echo "hello, I come"
} result=`func`
echo "The exit status of func is: $result" [root@benxintuzi shell]# ./37.sh
Please enter a value: 500
The exit status of func is: 1000
hello, I come

3 函数参数

函数可以利用标准的环境变量参数,$0表示函数名,$1表示第一个参数,$2表示第二个参数,...,$#表示参数个数。

#! /bin/bash
# access script parameters inside a function
# func() {
echo $[ $ * $ ]
} if [ $# -eq ]
then
value=`func $ $`
echo "The result is $value"
else
echo "Usage: func a b"
fi [root@benxintuzi shell]# ./38.sh 55 66
The result is 3630

4 函数变量

包括全局变量与局部变量。默认情况下,在shell中定义的任何变量都是全局变量。如果在变量定义前加上local关键字就变为局部变量了,如:local temp。

#! /bin/bash
# local and global variable
# func() {
local temp=$[ $value + ]
result=$[ $temp * ]
} value=
temp=
func echo "$temp"
echo "$result" [root@benxintuzi shell]# ./39.sh
20
30

5 数组变量

数组作为函数参数:

必须将数组变量分解为单个值,然后将这些值用作函数参数使用;在函数体中,可以将所有参数重组为新的数组变量:

#! /bin/bash
# array variable to function func() {
local newarray
newarray=(`echo "$@"`)
echo "The new array value is: ${newarray[*]}" local sum=
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo "The sum of newarray is: $sum"
} myarray=( )
echo "The original array is ${myarray[*]}"
func ${myarray[*]} [root@benxintuzi shell]# ./41.sh
The original array is 1 2 3 4 5
The new array value is: 1 2 3 4 5
The sum of newarray is: 15

数组作为函数返回值:

#! /bin/bash
# function return array func() {
local oriarray
local newarray
local elements
local i oriarray=(`echo "$@"`)
newarray=(`echo "$@"`)
elements=$[ $# - ] for (( i = ; i <= $elements; i++ ))
{
newarray[$i]=$[ ${oriarray[$i]} * ]
}
echo ${newarray[*]}
} myarray=( )
echo "The original array is ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`func $arg1`)
echo "The new array is: ${result[*]}" [root@benxintuzi shell]# ./42.sh
The original array is 1 2 3 4 5
The new array is: 2 4 6 8 10

6 创建库文件

函数库文件是为了解决不同脚本文件中使用相同函数块的问题。

首先定义一个库文件myfuncs用来解决四则运算功能:

[root@benxintuzi shell]# cat myfuncs
# my script functions addem() {
echo $[ $ + $ ]
} minusem() {
echo $[ $ - $ ]
} multiem() {
echo $[ $ * $ ]
} divem() {
if [ $ -eq ]
then
-
else
echo $[ $ / $ ]
fi
}

然后在脚本文件中使用库文件中的函数即可,但是使用前必须使用source命令或者.命令在当前上下文环境中运行库文件:

[root@benxintuzi shell]# cat .sh
#! /bin/bash
# using functions defined in a library file # excute library file in the context
. ./myfuncs # source ./myfuncs value1=
value2= result1=`addem $value1 $value2`
result2=`minusem $value1 $value2`
result3=`multiem $value1 $value2`
result4=`divem $value1 $value2` echo "addem($value1, $value2): $result1"
echo "minusem($value1, $value2): $result2"
echo "multiem($value1, $value2): $result3"
echo "divem($value1, $value2): $result4"

执行脚本文件:

[root@benxintuzi shell]# ./40.sh
addem(10, 4): 14
minusem(10, 4): 6
multiem(10, 4): 40
divem(10, 4): 2

7 在命令行中使用shell函数

方式一:

在命令行中直接定义一个函数:函数名及其函数体在一行内定义,不同语句之间用分号隔开:

[root@benxintuzi shell]# addem() { val1=; val2=; echo $[ val1 + $val2 ]; }
[root@benxintuzi shell]# addem

方式二:

在命令行中直接定义一个函数:函数名及其函数体在多行中定义,语句末尾不用加分号:

[root@benxintuzi shell]# addem() {
> val1=
> val2=
> echo $[ $val1 + $val2 ]
> }
[root@benxintuzi shell]# addem

方式三:

在.bashrc文件中定义函数:

在命令行中直接定义的shell函数在退出shell时就丢失了,如果想使得在每次启动新shell时都定义这个函数,一个比较好的办法就是将函数定义在.bashrc文件中。

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函数:Shell函数返回值、删除函数、在终端调用函数

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

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

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

  9. Linux Shell 函数返回值

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

随机推荐

  1. MVC ueditor的使用(实现上传图片功能)

    之前使用ckeditor不能实现上传图片功能,只要是我不知道怎么使用啦o( ̄ε ̄*),然后就换了ueditor~~,可以实现上传图片功能啦~\(≧▽≦)/~~ 下面是我的步骤:去官网下载最新版uedi ...

  2. 【WCF 2】理解WCF框架的简单小实例

    导读:上篇博客介绍了WCF框架的整体情况,然后,闲着没事儿,自己做了一个及其简单的WCF框架的例子帮助自己理解.从简单的入手,一步一步深入!本篇博客是介绍怎么用VS2012从头创建一个WCF项目,是一 ...

  3. 【MongoBD】MongoBD持久化

    参考:http://f.dataguru.cn/thread-139560-1-1.html 参考:http://blog.mongodb.org/post/33700094220/how-mongo ...

  4. Heavily reliance on forensic tools is risky

    We could take advantage of forensic tools to examine and analyze the evidence, but heavily reliance ...

  5. Android中SearchView修改字体颜色

    首先获取searchView控件,比如在actionbar上获取: SearchView searchView = (SearchView) menu.findItem(R.id.action_sea ...

  6. CentOS编译安装lamp

    LAMP环境搭建(编译安装CentOS+httpd2.2+mysql5.5+php5.4) 首先准备以下压缩包 <ignore_js_op> (1)编译安装apache 1.配置防火墙,开 ...

  7. [leetcode]_Unique Paths

    题目:有一个m * n 的方格,如下图,一个小robot希望从左上角走到右下角,共有多少种不同的路线走法. 思路: 我的错误思路:全排列,从(0,0)走到(m - 1,n - 1)共需要往下走m-1步 ...

  8. Sql Server 常用的查询

    基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 selec ...

  9. kvm介绍

    KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, 可以直接将Linux内核转换为Hypervisor(系统管理程 序)从而使得Linux内核能 ...

  10. php中intval()函数

    格式:int intval(mixed $var [, int $base]); 1.intval()的返回值是整型,1或者0.可作用于数组或者对象(对象报错信息:Notice: Object of ...