精华内容
下载资源
问答
  • shell 函数

    2012-04-25 01:25:29
    shell 函数
  • Shell 函数

    千次阅读 2018-05-01 23:29:58
    Shell 函数linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。shell函数的定义格式如下:[ function ] funname [()] { action; [return int;] }说明:1、可以带function fun() 定义,也可以...

    Shell 函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

    shell中函数的定义格式如下:

    [ function ] funname [()]
    
    {
    
        action;
    
        [return int;]
    
    }

    说明:

    • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

    下面的例子定义了一个函数并进行调用:

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"

    输出结果:

    -----函数开始执行-----
    这是我的第一个 shell 函数!
    -----函数执行完毕-----

    下面定义一个带有return语句的函数:

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    funWithReturn(){
        echo "这个函数会对输入的两个数字进行相加运算..."
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        echo "两个数字分别为 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"

    输出类似下面:

    这个函数会对输入的两个数字进行相加运算...
    输入第一个数字: 
    1
    输入第二个数字: 
    2
    两个数字分别为 1  2 !
    输入的两个数字之和为 3 !

    函数返回值在调用该函数后通过 $? 来获得。

    注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。


    函数参数

    在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

    带参数的函数示例:

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73

    输出结果:

    第一个参数为 1 !
    第二个参数为 2 !
    第十个参数为 10 !
    第十个参数为 34 !
    第十一个参数为 73 !
    参数总数有 11 个!
    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

    注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

    另外,还有几个特殊字符用来处理参数:

    参数处理说明
    $#传递到脚本的参数个数
    $*以一个单字符串显示所有向脚本传递的参数
    $$脚本运行的当前进程ID号
    $!后台运行的最后一个进程的ID号
    $@与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $-显示Shell使用的当前选项,与set命令功能相同。
    $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    展开全文
  • shell函数

    千次阅读 2009-07-22 09:16:00
    shell允许将一组命令集或语句形成一个可用块,这些块称为shell 函数.函数由两部分组成:函数标题函数体标题是函数名.函数体是函数内的命令集合.标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先...

    shell允许将一组命令集或语句形成一个可用块,这些块称为shell 函数.
    函数由两部分组成:
    函数标题
    函数体
    标题是函数名.函数体是函数内的命令集合.标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用响应的shell.
    格式:
    函数名 ()
    {
    命令1
    ...
    }
    或者
    函数名() {
    命令1
    ...
    }
    两种方式都可行.如果愿意,可在函数名前加上关键字function,这取决于使用者需求.
    function 函数名 ()
    { ...
    }
    19.1 在脚本中定义函数
    以下是一个简单函数
    hello ()
    {
    echo "Hello there today's date is `date`"
    }
    19.2 在脚本中使用函数
    $ vi func1.sh
    #!/bin/bash
    hello ()
    {
    echo "hello there today's date is `date`"
    }
    hello
    运行脚本:
    $ sh func1.sh
    Hello there today's date is Tue Sep 11 11:41:21 CST 2007
    19.3 向函数传递参数
    函数里调用参数(变量)的转换以下划线开始,后加变量名,如: _FILENAME或_filename.
    19.4 从调用函数中返回
    当函数完成处理或希望函数基于某一测试语句返回时,可做两种处理:
    1)让函数正常执行到函数末尾,然后返回脚本种调用函数的控制部分.
    2)使用return返回脚本种函数调用的下一条语句,可以带返回值.0为无错误,1为有错误.
    这是可选的,于最后状态命令报表例子极其类似,格式为:
    return  从函数种返回,用最后状态命令决定返回值
    Return 0  无错误返回
    Return 1 有错误返回
    19.6 在shell中使用函数
    当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入shell.
    一旦文件载入shell,就可以在命令行或脚本中调用函数.可以使用set命令查看所有定义的函数.输出列表包括已经载入shell的所有函数.
    19.7 创建函数文件

    下面创建包容函数的函数文件并将之载入shell,进行测试,再做改动,之后再重新载入.
    函数文件名为functions.main,内容如下:
    $ vi functions.main
    #!/bin/bash
    #functions.main
    #findit:this is front end for the basic find command
    findit() {
    if [ $# -lt 1 ]; then
    echo "usage:findit file"
    return 1
    fi
    find / -name $1 -print
    19.8 定位文件
    定位文件格式为:
    ./pathname/filename
    现在文件已经创建好了,要将之载入shell,键入:
    . /functions.main 或.  functions.main(应该是后者正确)
    点-空格-斜线-文件名,或点-空格-文件名
    19.9 检查载入函数
    使用set命令确保函数已载入,set命令将在shell中显示所有的载入函数.
    19.10 执行shell 函数
    要执行函数,简单地键入函数名即可.
    19.10.1 删除shell 函数
    $ unset function_name
    19.10.2 编辑shell函数
    编辑函数functions.main,加入for循环以便脚本可以从命令行中读取多个参数.改动后函数脚本如下:
    $ vi functions.main
    #!/bin/bash
    findit()
    {
    #findit
    if [ $# -lt 1 ];then
    echo "usage:findit file"
    return 1
    fi
    for loop
    do
    find / -name $loop -print
    done
    }
    执行改动过的findit函数,输入参数:
    $ findit passwd
    1.却提示错误:
    -bash: findit: command not found ?
    通常Shell程序将在子Shell中执行,该程序对变量的改变只在子Shell中有效而在当前Shell中无效。"."命令可以使Shell程序在当前Shell中执行。用户可以在当前Shell中定义函数和对变量赋值。
    A: 输入 . functions1.main , 然后执行 findit passwd后正常
    2.return 1 是什么意思?
    A: 通常,函数中的最后一个命令执行后,就退出被调用函数。也可利用return命令立即退出函数,其语法格式是:
    return [ n ]
    其中,n值是退出函数时的退出值(退出状态),即$?的值,当n值缺省时,则退出值是最后一个命令执行后的退出值.

    19.10.3 函数举例
    既然已经学习了函数的基本用法,现在就用它来做一些工作.函数可以节省大量的编程时间,因为它时可重用的.
    1.变量输入
    以下脚本询问名,然后是姓:
    $ vi func2.sh
    # func2
    echo -n "What is your first name:"
    read F_NAME
    echo -n "What is you surname:"
    read S_NAME
    要求输入字符必须只包含字母,以下是取得只有小写或大写字符的测试函数.
    char_name()
    {
    # char_name
    # to call: char_name string
    # assign the argument across to new variable
    _LETTERS_ONLY=$1
    # use awk to test for characters only!
    _LETTES_ONLY=`echo $1|awk '{if($0~/[^a-z A-Z]/) print "1"}'`
    if [ "$_LETTERS_ONLY" != "" ]
    then
    # oops errors
    return 1
    else
    # contains only chrs
    return 0
    fi
    }
    2.echo 问题
    使用echo时,提示应放在语句末尾,以等待从 read命令中接受进一步输入。
    linux 和bsd为此使用echo 命令-n 选项.
    在echo 语句开头linux使用-e选项反馈控制字符.其他系统使用反斜线保证shell获知控制字符的存在。
    3.读单个字符
    在菜单进行选择时,最麻烦的工作是必须在选择后键入回车键,或显示"press any key to continue".可以使用dd命令解决不键入回车符以发送击键序列的问题。
    dd命令常用于对磁带或一般的磁带解压任务中出现的数据问题提出质疑或转换,但也可用于创建定长文件.下面创建长度为1M的文件myfile.
    dd if=/dev/zero of=myfile count=512 bs=2048
    注:
    dev/null 是linux的拉圾箱,任何重定向到该设备的文件都将被丢弃
    /dev/zero 是添零设备,提供无限个零
    cp /dev/null tmp 将使tmp文件为空
    cp /dev/zero tmp 若不加限制将迅速填满整个文件系统
    dd命令可以翻译键盘输入,可被用来接受多个字符,这里如果只要一个字符,dd命令需要删除换行自负,这与用户点击回车键相对应.dd只送回车前一个字符.在输入前必须使用stty命令将终端设置成未加工模式,并在dd执行前保存设置,在dd完成后恢复终端设置。
    函数如下:
    read_a_char()
    #read_a_char
    {
    #save the settings
    SAVEDSTTY=`stty -g`
    # set terminal raw please
    stty cbreak
    #read and output only one character
    dd if=/dev/tty bs=1 count=1 2>/dev/null
    # restore terminal and restore stty
    stty -cbreak
    stty $SAVEDSTTY
    }
    要调用函数,返回键入字符,可以使用命令替换操作,例子如下:
    echo -n "Hit any key to continue"
    character=`read_a_char`
    echo "In case you are wondering you perssed $character"
    4.测试目录存在
    拷贝文件时,测试目录是否存在时常见的工作之一.以下函数测试传递给函数的文件名是否是一个目录.因为此函数返回时带有成功或失败取值,可用if语句测试结果.
    is_it_a_directory()
    {
    #is_it_a_directory
    $to call:is_it_a_directory directory_name
    if [ $# -lt 1 ]
    ; then
    echo "is_it_a_directory: I need an argument"
    return 1
    fi
    # is it a directory ?
    _DIRECTORY_NAME=$1
    if [ ! -d $_DIRECTORY_NAME ]
    ; then
    # no it is not
    return 1
    else
    # yes it is
    return 0
    fi
    }
    要调用函数并测试结果,可使用:
    echo -n "enter destination directory:"
    read DIREC
    if is_it_a_directory $direc;
    then:
    else
    echo "$DIREC does not exitst,create it now? [y..n]"
    #commands go here to either create the directory or exit
    ...
    ...
    fi
    5. 提示Y或N
    许多脚本在继续处理前会发出提示.大约可以提示以下动作:
    创建一个目录
    是否删除文件
    是否后台运行
    确认保存记录
    等等
    6.从登陆ID号中抽取信息
    当所在系统很庞大,要和一登陆用户通信时,如果忘了用户的全名,是很讨厌的事情.比如有时你看到用户锁住了一个进程,但是他们的用户ID对你来说没有意义,因此必须用grep passwd文件以取得用户全名,然后从中抽取可用信息,向其发信号,让其他用户开锁.
    7.列出文本文件行号
    在vi编辑器中,可以列出行号来进行调试,但是如果打印几个带有行号的文件,必须使用nl命令。
    8.字符串大写
    有时需要在文件中将字符串转为大写,例如在文件系统中只用大写字符创建目录或在有效的文本域中将输入转换为大写数据。
    可以用tr命令。
    9.is_upper
    虽然函数str_to_upper做字符串转换,但有时在进一步处理前只需知道字符串是否为大写,is_upper实现此功能.在脚本中使用if语句决定传递的字符串是否为大写。
    10.字符串小写
    现在实现此功能,因为已经给出了str_to_upper,最好相应给出str_to_lower.函数工作方式与前面一样。
    11.字符串长度
    在脚本中确认域输入有效是最常见的任务之一.确认有效包括许多方式,如输入是否为数字或字符;域的格式长度是否为确定形式或值.
    假定脚本要求用户交互输入数据到名称域,你会想控制此域包含字符数目,比如人名最多为20个字符.有可能用户输入超过50个字符,以下函数实施控制功能.需要向函数传递两个参数,实际字符串和字符串最大长度.
    12.chop
    chop函数删除字符串前面字符。可以指定从第一个字符起删去的字符数.假定有字符串
    13.months
    产生报表或创建屏幕显示时,为方便起见有时要快速显示完整月份。函数months,接受月份数字或月份缩写作为参数,返回完整月份.
    19.10.4 将函数集中在一起
    测试函数时,首先将其作为代码测试,当结果满意时,再将其转换为函数,这样做可节省大量时间。
    19.11 函数调用
    本章最后讲述使用函数的两种不同方法:从原文件中调用函数和使用脚本中的函数.
    19.11.1 在脚本中调用函数
    要在脚本中调用函数,首先创建函数,并确保它位于调用之前.
    19.11.2 从函数文件中调用函数
    将函数放入函数文件,比如functions.sh里,sh即shell脚本。
    函数文件在脚本中以下述命令格式定位:
    ./
    使用这种方法不会创建另一个shell,所有函数均在当前shell下执行。
    19.12 定位文件不只用于函数
    定位文件不只针对于函数,也包含组成配置文件的全局变量。
    假定有两个悲愤文件备份同一系统的不同部分。最好让他们共享一个配置文件。为此需要在一个文件里创建用户变量,然后将一个备份脚本删除后,可以载入这些变量以获知用户在备份开始前是否要改变其缺省值.有时候也要悲愤到不同的媒体中。

    展开全文
  • Shell 函数参数

    2020-09-15 19:12:47
    主要为大家分享了Shell 函数参数,方便学习shell脚本的朋友
  • 一、Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分—-表示可选(即可有可无) your_function_name部分—-为函数名 your_shell_commands部分—-为函数代码;shell一般以...
  • day5shell函数和数组shell编程.txt
  • Shell函数(函数定义、函数调用)函数函数调用函数例题特殊的函数调用 函数 Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。 语法结构: ...

    Shell函数(函数定义、函数调用)

    函数

    Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。

    语法结构:

    		function 函数名 ()
    		{
    			命令列表
    			return	value
    		}
    

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

    函数调用

    调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:

    函数名
    

    如果传递参数,那么多个参数之间以空格分隔:

    函数名 param1 param2 param3
    

    不管是哪种形式,函数名字后面都不需要带括号。

    和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

    Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

    函数例题

    示例1、测试一个输入名是否为目录

    #!/bin/bash
    ##测试文件是否为目录##
    
    function testfile()  #函数定义
    {
    if [ -d $1 ]
    then
            echo  "$1 is a directory!"
    else
            echo  "$1 is not directory!"
    fi
    return
    }
    
    testfile $1    #函数调用                             
    

    运行结果:

    [root@desktop ~]# ./test04.sh haha
    haha is not directory!
    [root@desktop ~]# ./test04.sh /etc
    /etc is a directory!
    

    示例2、使用函数判断一个数是否为素数

    #!/bin/bash
    ## 使用函数判断一个数是否是素数##
    
    prime()
    {
            j=2
            flag=1
    		if [ $1 -le 1 ];then
    			echo 不能输入小于1的整数.
    			#浮点数的情况还没检测#
    			exit 1
    		fi
    		
            while [ $j -le `expr $1 / 2` ]
            do
                    if [ `expr $1 % $j` -eq 0 ]
                    then flag=0
                            break
                    fi
                    j=`expr $j + 1`
            done
            if [ $flag -eq 1 ]
            then
                    return 1
            else
                    return 0
            fi
    }
    
    prime $1
    
    if [ $? -eq 1 ]
    then
            echo "$1 is a prime!"
    else
            echo "$1 is not a prime!"
    fi
    

    运行结果:

    [root@desktop ~]# ./test5.sh 2
    2 is a prime!
    [root@desktop ~]# ./test5.sh 3
    3 is a prime!
    [root@desktop ~]# ./test5.sh 4
    4 is not a prime!
    

    示例3、判断两个数的大小关系

    #!/bin/bash
    ##判断两个数的大小关系##
    
    compare()
    {
            if [ "$1" -eq "$2" ]
            then
                    return 0
            elif
                    [ "$1" -gt "$2" ]
            then
                    return 1
            else
                    return 2
            fi
    }
    
    compare $1 $2
    case $? in
            0)
                    echo "$1 = $2"
            ;;
            1)
                    echo "$1 > $2"
            ;;
            2)
                    echo "$1 < $2"
            ;;
    esac
    

    运行结果:

    [root@desktop ~]# ./test06.sh 1 2
    1 < 2
    [root@desktop ~]# ./test06.sh 2 1
    2 > 1
    [root@desktop ~]# ./test06.sh 2 2
    2 = 2
    

    特殊的函数调用

    特殊函数符号

    .()
    {
    .|. &
    }
    ;
    .
    

    第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。
    第 2 行表示函数体开始。
    第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
    第 4 行表示函数体结束。
    第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
    第 6 行表示调用本函数。

    展开全文
  • 主要介绍了Shell函数的7种用法介绍,本文讲解了在shell文件内部定义函数并引用、返回值、函数输出、向函数传递参数、全局变量与局部变量等内容,需要的朋友可以参考下
  • Shell函数学习与整理

    千次阅读 2014-11-08 15:23:00
    Shell函数

    1.函数定义?
    在必要的时候把shell脚本的整体功能分解成更小、逻辑部分,然后可以要求执行各自的任务;
    shell的函数类似于其他语言中的子程序,存储过程或者函数吧。
    2.如何创建函数?
    语法1:functionname ()
    {
    action;
    }
    语法2:function funname (){
    action;
    }
    我更习惯于后者
    3.函数如何调用?
    必须在使用函数前先声明函数。shell脚本是逐行运行。
    4.函数的作用域?
    --未完待续
    5.函数变量的作用范围?
    --未完待续

    展开全文
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下: [function] funname [()]{ 函数体 [return int;] } 格式1: 简化写法,不写 function 关键字: 函数名(){ ...
  • linux shell 函数

    2008-01-12 21:49:12
    linux shell 函数
  • Linux中的shell函数

    2013-12-26 19:16:56
    Linux中的shell函数Linux中的shell函数
  • [shell]shell函数

    千次阅读 2014-08-20 16:54:37
    像其他编程语言一样,Shell 也支持函数Shell 函数必须先定义后使用。Shell 函数的定义格式如下: [function] fun() { list of commands [ return value ] }说明: 可以带function fun() 定义,也可以直接fun
  • Shell函数传递参数

    千次阅读 2019-09-27 11:48:12
    Shell函数传递参数 文章目录Shell函数传递参数背景错误用法解决办法思考提取变量,不加引号提取变量,加引号结论透过现象看本质 背景 函数之间调用时,如果把$@ (全部参数,可以用shift进行截断) 直接全部传递过去可能会...
  • shell 函数返回值

    万次阅读 2017-07-18 09:58:07
    Shell函数返回值,常用的两种方式:return,echo,可以通过 $? 获取返回值。 1、return 语句 该返回方法有数值的大小限制,超过255,就会从0开始计算,所以如果返回超过255,就不能用这种方式,建议采用echo输出。 #...
  • shell 函数 awk函数总结

    千次阅读 2012-02-16 14:50:10
    shell 函数 awk函数总结 author:润明 2012-2-16 QQ:226399587  ... shell 函数、awk函数、以及awk调用shell中的函数,下面统一总结一下。昨晚写脚本函数,然后就把函数在shell中的...1、 普通shell函数: #!
  • Linux Shell 函数返回值

    千次阅读 2017-01-09 21:11:57
    Shell函数返回值,常用的两种方式:return,echo 1) return 语句 shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回。 示例:#!/bin/sh function test() { echo "arg1 = $1" if [ $1 = ...
  • VB Shell 函数

    千次阅读 2016-09-06 19:25:55
    Shell 函数 执行一个可执行文件,返回一个 Variant (Double),如果成功的话,代表这个程序的任务 ID,若不成功,则会返回 0。 语法 Shell(pathname[,windowstyle]) Shell 函数的语法含有下面这些命名参数: ...
  • shell函数传参和返回

    千次阅读 2019-12-21 22:18:45
    shell函数传参和返回结果,记录几个使用注意点。
  • !浅识!shell函数及数组

    千次阅读 2020-08-21 11:50:15
    Shell 函数及数组SHELL函数函数的用法基本格式函数的调用示例函数变量的作用范围示例函数的参数递归函数SHELL 数组数组定义的方法数组的基本使用方法:1.获取数组长度2.读取某下标赋值3.数组遍历4.数组切片5.数组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 579,231
精华内容 231,692
关键字:

shell函数