`
天梯梦
  • 浏览: 13731348 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

shell 编程 : 函数

 
阅读更多

shell script 作为一种结构化的编程语言,允许在 script 中定义和使用函数。函数是将一组命令集或者语句形成一个可复用的代码块。

1. 函数定义
shell 函数和其他语言的函数一样,都需要先定义才能使用。

语法格式如下:

    function_name ()
    {
        ...
    }

 
或者

    function_name () {
        ...
    }

 
或者

    function function_name [()]
    {
        ...
    }

 
或者

    function function_name [()] {
        ...
    }

 
1 function_name 是函数名;花括号之间的内容是函数体(命令或者语句的集合)。
2 命令 function 是可选的。如果 function 存在,则后面的圆括号是可选的;如果省略 function,则后面的圆括号不能省略。
3 左花括号也可以写在和函数名的同一行。

2. 函数调用
shell 函数调用的方式和 shell 命令是一样的,可以把函数当作命令来使用。

语法格式如下:

    function_name [arguments ...]

1 函数和参数之间、参数和参数之间使用空格分隔。
2 函数和命令在使用上基本相同,同样都可以使用 shell 的命令替换功能($()、``)。

示例 1

test.sh 文件的内容如下

ERROR_CODE=255

max_value ()
{
    if [ $# != 2 ]; then
        echo invalid argument
        return $ERROR_CODE
    fi
   
    echo max number is $(($1 > $2 ? $1 : $2))
}

max_value 23 12

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
max number is 23
malihou@ubuntu:~$ 

 
示例 2

test.sh 文件的内容如下

version()
{
    echo "GNU bash, version 4.2.24(1)"
}

bash_version=`version`
echo $bash_version

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
GNU bash, version 4.2.24(1)
malihou@ubuntu:~$ 

 
3. 函数名
shell 函数的函数名保存在数组变量 FUNCNAME 中。这个变量只能使用在函数中,使用在其他地方将无效。

示例 3

test.sh 文件的内容如下

func3 ()
{
    echo $FUNCNAME : ${FUNCNAME[@]}
}

func2 ()
{
    func3
    echo $FUNCNAME : ${FUNCNAME[@]}
}

func1 ()
{
    func2
    echo $FUNCNAME : ${FUNCNAME[@]}
}

func1

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
func3 : func3 func2 func1 main
func2 : func2 func1 main
func1 : func1 main
malihou@ubuntu:~$ 

 
4. 函数参数
1 shell 允许在调用函数的时候使用任意个参数,函数以位置来引用传递过来的参数。因此参数在函数内部会成为位置参数,其使用方法和 script 中相同。
2 shell 会保存调用函数前的位置参数,以便在函数内部重新给位置参数赋值。在函数调用完成后,位置参数会还原回函数调用前的值。传递给函数的参数和传递给 script 的命令行参数不会被混淆。
3 位置参数可以使用在 script 和函数内部。
4 和其它语言不同的是,shell 将传递给函数的参数都解释为字符串,在这之前会对参数进行 ~ 展开、参数和变量展开、算术展开、命令替代操作。

示例 4

test.sh 文件的内容如下

num1=12
num2=23
num3=34

test_positonal_parameter ()
{
    echo \$#=$# \$@="$@"
}

echo \$#=$# \$1=$1 \$2=$2

test_positonal_parameter $num1 $num2 $num3 45

echo \$#=$# \$1=$1 \$2=$2

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh 1 2
$#=2 $1=1 $2=2
$#=4 $@=12 23 34 45
$#=2 $1=1 $2=2
malihou@ubuntu:~$ 

 
5. 函数局部变量
1 在函数内部定义的变量在默认情况下都是全局变量(没有使用命令 local 声明),这些全局的变量在函数调用之后才可以在函数外部使用。
2 如果变量在使用命令 local 声明后,就成为局部变量,其只能在函数内部及其子函数内被使用。
3 在函数调用之后,所有在函数内定义且没有使用命令 local 声明的变量都可以在函数外部可见。

示例 5

test.sh 文件的内容如下

test_variable ()
{
    var1=global
    local var2=local
   
    echo var1=$var1 var2=$var2
}

echo var1=$var1 var2=$var2

test_variable

echo var1=$var1 var2=$var2

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
var1= var2=
var1=global var2=local
var1=global var2=
malihou@ubuntu:~$ 

 
局部变量可以递归。因此在实现函数递归调用时,必须使用局部变量。但是太多层的递归会消耗大量的内存,因此递归调用需谨慎使用。

使用函数递归输出杨辉三角(pascal's triangle)。

示例 6

test.sh 文件的内容如下

if [ $# -eq 0 ]
then
    echo invalid argument
    exit
fi

recursive ()
{
    local i=$1
    local j=$2
    local m
    local n

    if [ $j -eq 1 ] || [ $j -eq $i ]
    then
        return 1
    fi

    recursive $((i-1)) $((j-1))
    m=$?
    
    recursive $((i-1)) $((j))
    n=$?
   
    return $((m + n))
}

for i in `eval echo {1..$1}`
do
    for j in `eval echo {1..$i}`
    do   
        recursive $((i)) $((j))
        result=$?
        
        if [ $j -eq $i ]
        then
            echo "$result"
        else
            echo -n "$result    "
        fi
    done
done

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh 6
1
1    1
1    2    1
1    3    3    1
1    4    6    4    1
1    5    10    10    5    1
malihou@ubuntu:~$ 

 
6. 函数返回值
1 shell 函数是有返回值的。命令 return 可选的带一个整数参数(不带参数的 return 等同于 return $?),这个整数值会返回给调用此函数的 script。同时这个整数值会赋给变量 $?。
2 如果在函数中不使用 return 返回或者使用不带参数的 return,则将返回函数最后一条语句的退出状态的值(exit status = $?)。
3 退出状态 $? 的值是有限制的,其值的范围为 0 <= $? <= 255。如果超出这个范围,shell 会对 $? 的值进行取模运算($? % 256)。
4 命令 return 只能使用在 shell 函数中,不能使用在其他地方。

示例 7

test.sh 文件的内容如下

test_return ()
{
    return $1
}

test_return 128
echo \$?=$?

test_return 255
echo \$?=$?

test_return 258
echo \$?=$?

 

执行结果如下:

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
$?=128
$?=255
$?=2
malihou@ubuntu:~$ 

 
如果想在函数中返回一个大的整数值,则需要通过在函数中将返回值传递给一个全局变量来实现。或者是让函数将返回值输出到标准输出,然后再通过命令替代的方式捕获这个返回值。

示例 8

test.sh 文件的内容如下

return_value=0

if [ $# -lt 4 ]
then
    echo invalid argument
    exit
fi

max_value1 ()
{
    return_value=$(($1 > $2 ? $1 : $2))
}

max_value2 ()
{
    echo $(($1 > $2 ? $1 : $2))
}

max_value1 $1 $2

echo max value is $return_value

echo max value is `max_value2 $3 $4`

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh 1000 1234 2000 2234
max value is 1234
max value is 2234
malihou@ubuntu:~$ 

 
7. 创建函数文件
和 c 语言的库函数一样,在 shell 中可以把一些经常使用的函数放在一起,并保存在函数文件中。当函数文件加载到 shell 后,就可以在命令行或者 script 中调用函数文件中的函数。

1 函数文件的文件名可以任意选取。
2 使用命令 set 查看所有定义的变量和函数。
3 使用命令 unset 删除变量和函数。

8. 加载函数文件
加载函数文件时,需要使用命令 source file 和 . file 的方式。

示例 9

shell_function.sh 文件的内容如下

echo "Usage : compare two number"

max_value ()
{
    return $(($1 > $2 ? $1 : $2))
}

 

加载函数文件,执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ source shell_function.sh
Usage : compare two number
malihou@ubuntu:~$ 

 

将函数加载到 shell 后,执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ max_value 23 45
malihou@ubuntu:~$ 
malihou@ubuntu:~$ echo $?
45
malihou@ubuntu:~$ 

 
如果需要在其他 script 中使用函数文件,则首先需要在 script 的开头使用 source file 和 . file 将函数文件加载到当前 script 中,才可以使用这些函数。

示例 10

test.sh 文件的内容如下

source shell_function.sh

max_value 123 23
echo the max value is : $?

 

执行结果如下

malihou@ubuntu:~$ 
malihou@ubuntu:~$ ./test.sh
Usage : compare two number
the max value is : 123
malihou@ubuntu:~$ 

 

 

 

 

 

 

 

 

来源: http://malihou2008.blog.163.com/blog/static/211820045201210462849297/

 

 

分享到:
评论

相关推荐

    VBA编程:Shell函数命令大全

    shell编程与普通的编程语言相比,shell编程可以用来执行一些流程调度以及任务量比较轻的处理流程的处理工具--因为毕竟是系统命令的整合调用,处理的时候,都会产生系统调用,在处理任务量大且比较复杂的流程的任务时...

    Shell编程:Linux系统环境程序设计之路

    本文将深入探讨Shell编程中的几个关键概念,包括函数、return语句、break和continue、echo、eval、export、printf以及set和trap等。 首先,函数在Shell编程中扮演着至关重要的角色。通过定义函数,可以将重复的代码...

    Shell编程高级进阶系列视频.zip

    15Shell编程之函数及脚本案例讲解 16Shell编程之函数及脚本案例讲解 17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED命令实战 19Shell编程之awk、sed演练 20Shell编程之awk、sed演练( 21Shell编程...

    精通WindowsAPI:函数、接口、编程实例 电子书

    《精通WindowsAPI:函数、接口、编程实例》全书共18章,分为3个部分,第1部分(第1章~第3章)介绍Windows程序设计基础;第2部分(第4章~第17章)按照程序设计的各个方面进行划分,包括文件系统、内存管理、进程与线程、...

    shell编程入门经典--LINUX与UNIX Shell编程指南 (中文pdf版)

    《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...

    linux-shell的函数式编程工具

    本文将深入探讨“Linux Shell”的函数式编程工具,帮助你更好地理解和利用这个强大的工具。 首先,让我们理解什么是函数式编程。函数式编程是一种编程范式,它强调程序的数据流和变换,而不是对指令进行控制。在...

    Linux与UNIX Shell编程指南.pdf

    "Linux与UNIX Shell编程指南" Linux与UNIX Shell编程指南是计算机科学领域中一本经典的指南手册,旨在帮助读者快速掌握Linux与UNIX操作系统下的shell编程技术。下面是从该书中生成的相关知识点: 1. Shell概述 ...

    shell编程入门教程+shell脚本专家指南+UNIX.shell编程24小时教程.rar

    本文将深入探讨Shell编程的基础知识,包括基本语法、常用的内置命令、条件语句、循环结构以及函数的使用,旨在帮助初学者快速入门,并逐步提升为Shell脚本专家。 首先,让我们了解什么是Shell。Shell是操作系统提供...

    UNIX命令及SHELL编程

    19_基础shell编程-shell 函数.PDF 20_基础shell编程-向脚本传递参数.PDF 21_基础shell编程-创建屏幕输出.PDF 22_基础shell编程-创建屏幕输入.PDF 23_基础shell编程-调试脚本.PDF 24_基础shell编程-shell嵌入...

    Linux下Shell编程从入门到精通视频教程.txt

    20、Shell编程之学习心得分享及拓展.mp4 19、Shell编程之实战WEB界面展示二.mp4 18、Shell编程之实战WEB界面展示一.mp4 17、Shell编程之磁盘监控报警脚本.mp4 ...09、Shell编程之函数及案例分析.mp4 08、She

    c语言函数与shell编程

    ### C语言函数与Shell编程 #### 一、嵌入式操作系统概述 嵌入式操作系统(Embedded Operating System,简称EOS)是一种专门为嵌入式系统设计的操作系统。它与传统的桌面操作系统如Windows有所不同,主要体现在以下...

    Shell编程函数集

    Shell编程函数集,shell编程必读,想学linux上编程的可以下去看下

    Windows Shell 编程指南与实例

    Shell编程则允许开发者通过编写脚本或程序来自动化常见的系统任务,提高工作效率。 一、Windows Shell基础 Windows Shell编程的基础在于了解批处理(Batch)脚本和Windows Script Host (WSH)。批处理脚本是包含一...

    shell demo及编程pdf

    **Shell编程介绍** Shell编程是Linux/Unix操作系统中的一种脚本语言,用于自动化日常任务,交互式地控制操作系统,以及实现系统级别的程序间交互。它提供了命令行接口(CLI)来执行各种系统命令,使用户能够高效地...

    LinuxShell编程基础.pdf

    Linux Shell 编程基础包括了解 Shell 的基本概念、Shell 变量、条件语句、循环语句、函数等。掌握这些基础知识后,可以编写出更加复杂的 Shell 脚本,实现自动化任务、数据处理、系统管理等功能。 1. Shell 变量 ...

    linux实验shell编程.pdf

    4. shell函数:shell函数是指可以重复使用的代码块,它们可以用来实现复杂的逻辑操作。 三、shell特殊字符 shell特殊字符是指在shell脚本中使用的特殊字符,它们可以用来实现特殊的操作。常见的shell特殊字符包括...

    实践大师:Unix Shell编程篇

    在IT领域,Unix Shell编程是一种极其重要的技能,尤其对于系统管理员和开发者来说,它既是工具又是脚本语言。本文将深入探讨Unix Shell编程的核心概念、语法特性以及实用技巧,帮助你成为一位熟练的Shell编程实践...

    shell编程 创建shell脚本 shell 基础语法 shell流程控制语法 shell函数

    首先,让我们理解一下 Shell 编程的基础。Shell 是操作系统提供的一种命令解释器,用户通过 Shell 与操作系统进行交互。在 Linux 系统中,Bash(Bourne-Again SHell)是最常见的默认 Shell。Shell 脚本是一系列 ...

Global site tag (gtag.js) - Google Analytics