精华内容
下载资源
问答
  • linux shell函数定义调用

    千次阅读 2016-08-10 10:33:29
    然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。 一、Shell...
    说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。

    一、Shell中函数的定义
    为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西。而Shell中函数的定义有两种方法,如下:
    function fname()
    {
    statements;
    }
    fname()
    {
    statements;
    }
    注意,()内是没有参数的,它并不像C语言那样,在()里可以有参数。

    那大家可能就郁闷了,函数调用或多或少总是会需要一些参数,那么这些参数要怎么传递进来呢?其实参数传递方式为:fname;(不需要传递参数)或fname agr1 arg2(需要传递两个参数);

    二、自定义函数的例子
    不知道大家的情况如何,反正一开始我就觉得很别扭,因为在C语言中,例如我定义一个函数int cmp(int a, int b),那么我就会在函数中使用到函数头中声明的变量a和b,而在Shell中却没有定义参数,那我的函数又需要用到这两个参数,怎么办好呢?下面就用一个例子来说明好了。
    [plain]  view plain  copy
     print ?
    1. #! /bin/bash  
    2. # Filename:LoopPrint.sh  
    3.   
    4. function LoopPrint()  
    5. {  
    6.     count=0;  
    7.     while [ $count -lt $1 ];  
    8.     do  
    9.     echo $count;  
    10.     let ++count;  
    11.     sleep 1;  
    12.     done  
    13.     return 0;  
    14. }  
    15.   
    16. read -p "Please input the times of print you want: " n;  
    17. LoopPrint $n;  

    先来说说这个程序的功能吧,就是输入一个数字n,然后从0开始每隔1秒输入一个数字,直到输出n-1为止。首先,程序会要求你输入一个数学,然后调用函数来进行输出的功能。

    注意注释1的那一句,里面有一个变量$1,大家应该还记得调用函数时参数的传递方式,即fname agr1 arg2,这里的$1就是表示第一个参数,依此类推,$2就是第二个参数,$3就是第3个参数,$n就是表示第n个参数。

    所以$1就是变量n的值。这样说大家懂了吧!

    补充一下,就是:
    $0:是脚本本身的名字;
    $#:是传给脚本的参数个数;
    $@:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;
    $*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中c是IFS的第一个字符;
    $$:是脚本运行的当前进程ID号;
    $?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;

    特别注意,传递参数时,(这个例子中)一定要写成LoopPrint $n;而不能写成LoopPrint n。为什么?例如你输入的是20,则n的值($n)为20,前者表示的是把n的值,即20传递给函数LoopPrint,而后者则表示把字符n传递给函数LoopPrint。这点与在静态语言中的函数参数传递是很不同的,因为在Shell中变量的使用并不需要先定义,所以要使用变量,让Shell知道它是一个变量,并要传递它的值时,就是用$n,而不能直接用n,否则只把n当作一个字符来处理,而不是一个变量。

    三、作用域问题

    函数的作用域与C/C++语言中的作用约束是一样的,函数的定义一定要出现在函数的调用语句之前,但是有一点跟C/C++中不一样的就是变量的作用域问题,经过本人的试验,在注释1的语句改为while [ $count -lt $n ];也是可行的,即函数可以使用本文件中出现的任何变量,但是本人还是建议使用上面例子中的方法,即while [ $count -lt $1 ],并且不要随意使用函数中的变量之外的变量,因为你并不一定知道你调用函数时函数外有什么变量存在也不知道它的值是什么,也不能保证别人在使用你的函数时会传递你在函数中使用到的变量名,如这里的n,别人在使用时可能传递的就是他自己定义的变量,如Count等



    转自http://blog.csdn.net/ljianhui/article/details/9333443

    展开全文
  • 一、Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分----表示可选(即可有可无) your_function_name部分----为函数名 your_shell_commands部分----为函数代码;shell一般以...

    一、Shell函数定义格式

    shell函数定义格式,各部分说明如下:

    [ function ]等中括号括起来部分----表示可选(即可有可无)

    your_function_name部分----为函数名

    your_shell_commands部分----为函数代码;shell一般以行为单位,但可以使用“\”换行,也可以在单行内使用“;”作为分隔符

    return int部分----shell函数可以有返回值,但只能返回整数不能返回字符串

    [ function ] your_function_name()
    {
        your_shell_commands;
        [return int;]
    }

     

    二、基本函数定义与调用

    本节程序实现函数定义与调用,注意调用函数是不要使用括号(即如testFun()是不对的),代码如下:

    testFun{
        echo "helloworld!"
    }
    
    testFun

    运行如下:

     

    三、函数传参调用

    本节程序实现向被调用函数传递参数,$0是运行该脚本的shell传递的参数从$1开始、传递多个参数是以空格分隔,代码如下:

    testFun(){
        echo $1
    }
    
    param="helloworld!"
    testFun $param

    运行如下:

    除了可以通过$n形式获取第n个参数外,还可以使用以下几个写法:

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

     

     

     

     

     

     

     

     

     

     

    四、传递有空格参数

    本节程序实现向被调用函数传递有空格的参数,我们将上节“helloworld!”加个空格变为“hello world!”如下:

    testFun(){
        echo $1
    }
    
    param="hello world!"
    testFun $param

    运行如下:

    可以看到只有空格前的“hello”被打印了出来,空格后的“world!”并没被打印出来(实际上空格后的"world!"被识别成了$2)

    要传递有空格的参数也简单,在传递时加上双引号即可(单引号就不被认为是变量了所以不能用单引号),代码如下:

    testFun(){
        echo $1
    }
    
    param="hello world!"
    testFun "$param"

    运行如下:

     

    五、返回字符串

    我们在第一节中说shell函数只能返回整型不能返回字符串,我们试一下强行返回字符串,代码如下:

    testFun(){
        echo "helloworld!"
        return "success"
    }
    
    testFun

    运行如下,可以看到运行到return处报错“-bash: return: success: numeric argument required”

     

    所以要通过return返回字符串是没戏的,我们有两个变通的方法,第一种是通过$()获取函数的所有打印,代码如下:

    testFun(){
        echo "helloworld!"
        echo "success"
    }
    
    return_value=$(testFun)
    echo "$return_value"

    运行如下:

    可以看到成功获取到了‘success“。但同时也可以看到这种做法获取到的被调用函数的所有输出,单要返回值到得单独解析一下

    另外的一种做法是直接用一个变量,shell的变量都是全局的在被调用函数中赋值的变量在调用函数处也可获取,代码如下:

    testFun(){
        echo "helloworld!"
        return_value="success"
    }
    
    testFun
    echo $return_value

    运行如下:

     

    参考:

    http://www.runoob.com/linux/linux-shell-passing-arguments.html

    展开全文
  • 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 行表示调用本函数。

    展开全文
  • ################函数############# (1).语法 函数名() { 函数体 return n } 或 function 函数名(){ ...(2).调用函数 ...(3)....每次引用函数时,bash回重新回到函数的定义 ,用一个脚...

    ################函数#############

    (1).语法

    	函数名() {
    		函数体
    		return n
    	}
    

    	function 函数名(){
    		函数体
    		return n
    	}
    

    (2).调用函数

    	#!bin/bash
    	function fun1() {
    		echo "westos"
    	}
    
    	fun1
    

    在这里插入图片描述
    (3).引用函数

    每次引用函数时,bash回重新回到函数的定义 ,用一个脚本来理解
    打出5个echo输出结束循环并且结束后打出一次输出
    可见每次输出后都重新读取函数的定义i am a boy

    在这里插入代码片
    
    	#!bin/bash
    	function fun1() {
    		echo "i am boy"
    	}
    
    	count=1
    	while [ $count -le 5 ]
    	do
    		fun1
    		count=$[ $count + 1 ]
    	done
    
    	echo "end of loop"
    
    	fun1
    	echo "end of script"
    

    在这里插入图片描述
    sh -x (脚本)可以看脚本如何运行来调式脚本
    在这里插入图片描述
    (4)使用函数要先定义

    下面这个脚本在使用fun2之后才定义,会报错

    	#!bin/bash
    	count=1
    	echo "before function definition"
    
    	function fun1() {
    		echo "fun1"
    	}
    
    	while [ $count -le 5 ]
    	do
    	 	fun1
    		count=$[ $count + 1 ]
    	done
    
    	echo "end of loop"
    
    	fun2
    	function fun2() {
    		echo "fun2"
    	
    	}
    

    在这里插入图片描述
    在这里插入图片描述
    (5).定义同样的函数时会覆盖掉同名函数

    	#!/bin/bash
    	function fun1() {
    	    echo "first fun1"
    	}
     
    	fun1
     
    	function fun1() {
    	    echo "second fun1"
    	}
     
    	fun1
     
    	function fun1() {
    	    echo "third fun1"
    	}
     
    	fun1
    	echo "End"
    

    在这里插入图片描述
    可见每一次定义fun1都会覆盖上一个定义

    (6).返回值

    	#!/bin/bash
    	function fun1() {
    	    echo "trying to display a non-existent file"
    	    ls -l westosfile &> /dev/null
    	}
     
    	echo "test the function:"
    	fun1
    	echo "The exit status is : $?"
    

    在这里插入图片描述
    函数退出时返回值非0时执行有错误

    当我们设置return 0时输出的返回值为0即使执行的结果报错
    注意return 0必须写在定义函数内容里
    同理能修改为任意数字

    	#!/bin/bash
    	function fun1() {
    	    echo "trying to display a non-existent file"
    	    ls -l westosfile &> /dev/null
    	    return 0
    	}
     
    	echo "test the function:"
    	fun1
    	echo "The exit status is : $?"
    

    在这里插入图片描述

    return可以在后面接一个函数改变返回值为运算结果

    	#!/bin/bash
    
            function db1() {
                read -p "Enter a value:" value
                return $[ $value * 2 ]
            }
    	db1
         	   echo "The new value is $?"
    

    在这里插入图片描述
    可见$?变为了输入值乘2

    (7).使用函数输出

    这样能把函数输出保存在shell变量中
    可以获得任何类型的函数输出保存到变量里

    	#!/bin/bash
    	function db1() {
    		read -p "enter a value:" value
    		echo $[ $value * 2 ]
    	}
    	
    	result=`db1`
    	echo "the new value is $result"
    

    在这里插入图片描述
    (8).函数中使用变量
    可以向函数中传递参数
    函数名会在$0变量中定义
    函数命令行上的任何参数都会通过$1,$2定义
    $#来判断传给函数的参数数目

    写脚本运算两数字相乘,输入数字多于或少于两个数字报错

    	#!/bin/bash
    	function fun1() {
    	    echo $[ $1 * $2 ]
    	}
     
    	if [ $# -eq 2 ];then
    	    value=`fun1 $1 $2`
    	    echo "The result is $value"
    	else
    	    echo "Usage:fun1 a b"
    	fi
    

    在这里插入图片描述

    (9).设置当函数没有获得$1值时,和获得值的不同情况执行不同函数

    写脚本输入空格输出-1,输入两个数输出相加结果,输入一个数等于自身相加

    	#!/bin/bash
    	a=$1
    	b=$2
     
    	function kong() {
    	    echo "-1"
    	}
    	function dan() {
    	    echo " $a + $a = $[a+a] "
    	}
    	function shuang() {
    	    echo " $a + $b = $[a+b] "
    	}
    		if [ $# == 0 ];then
    		kong
    		elif [ $# == 1 ];then
    		dan
    		elif [ $# == 2 ];then
    		shuang
    		else 
    	 	echo " command error "
    	 	fi
    

    在这里插入图片描述
    #############变量的作用域#####################
    1.全局变量在函数内和外都能用

    这里函数内代表的是定义函数的大括号内

    	#!/bin/bash
    	function db1() {
    		value=$[ $value * 2 ]
    	}
    
    	read -p "enter a value: " value
    	db1
    	echo " the new value is:" $value
    

    在这里插入图片描述
    2.局部变量
    定义用local $value
    此时在定义函数的大括号外输入$value时显示的值与定义函数的大括号内的修改无关
    用脚本证明

    	#!/bin/bash
    	function fun1() {
    	    local temp=$[ $value + 5 ]
    	    result=$[ $temp * 2 ]
    	}
     
    	temp=4
    	value=6
     
    	fun1
     
    	echo "The result is $result"
    	if [ $temp -gt $value ];then
    	    echo "temp is larger"
    	else
    	    echo "temp is smaller"
    	fi
    

    在这里插入图片描述

    ################函数第归##############
    1.第归计算阶乘

    	#!/bin/bash
    
    	read -p "Num:" num
    
    	result=1
    	for i in `seq $num`
    	do
    		result=$[ $result * $i ]
    	done
    
    	echo "the result is $result"
    

    在这里插入图片描述
    用函数第归运算
    for语句调用function

    	#/bin/bash
    	read -p "Num: " num
    	        d=1
    
    
    	function fun1(){
    	        d=$[ $d * $i]
    	}
    
            for i in `seq $num`
            do
            fun1
            done
            echo $d
    

    在这里插入图片描述

    展开全文
  • 然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。 一、Shell中...
  • shell脚本(函数定义及参数调用

    千次阅读 2019-09-18 05:24:17
    函数的定义及参数调用函数是完成特定功能的代码片段,在shell定义函数可以使用代码模块化,便于调用,函数必须先定义才可以使用。一、定义函数的方式方法一:函数名() { 函数要实现的功能代码}方法二:function ...
  • 1、system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include&lt;stdlib.h&gt;定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程...
  • Shell中的函数调用

    千次阅读 2016-03-23 10:21:21
    然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。 一、Shell中...
  • shell中函数的定义调用

    千次阅读 2019-06-10 16:13:33
    脚本中的函数是把一个复杂的语句块定义成一个字符串的方法 然后每次想使用某一个功能的时候,直接调用函数就可以 比如: Host_Message() { read -p "Please input you action: " Action [ ...
  • Shell之function函数的定义调用

    万次阅读 2018-10-30 21:51:30
    文章目录`function`函数的定义调用`function`函数的定义`function`函数的调用【位置传参】函数使用return返回值【位置传参】函数的调用【数组传参】 function函数的定义调用 将一些相对独立的代码变成函数,...
  • 1、system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh...
  • 背景在处理数据的时候对于一些文本需要...shell函数先温习一下普通shell的写法[root@wmstianjin16172 ~]# vim funComm.sh #!/bin/bash #编写shell function输出结果可以使用变量进行接收,然后处理 function funComm()
  • shell 脚本-函数的定义调用

    千次阅读 2016-10-28 20:50:42
    fun() { echo I am function } # invoking function fun fun2() ...#调用函数 X=`fun2` echo $X fun3() { echo "\$0 = $0" # 获取调用函数时 传入的参数 echo "\$1 = $1" echo "\$2 = $2" retu
  • shell脚本中,怎么定义函数及使用函数呢? 函数定义: # func_name 函数名 function func_name(){ #函数体内容 } 或 # func_name 函数名 func_name(){ #函数体内容 } 函数调用: func_name parm  函数
  • Shell脚本函数的作用主要是把一些可以通用的功能封装起来、避免脚本中出现大量重复的脚本代码,同时可以大大增强脚本的可读性、和可维护性。Shell函数定义的语法格式:fu...
  • shell调用sqlplus

    千次阅读 2011-05-27 18:19:00
    一、最简单的shell调用sqlplus. $ vi test1.sh #!/bin/bash sqlplus -S /nolog > result.log <<EOF<br />set heading off feedback off pagesize 0 verify off echo off conn u_test/...
  • 主要介绍了Shell调用、引用、包含另一个脚本文件的三种方法,需要的朋友可以参考下
  • shell 方法

    千次阅读 2018-09-08 19:04:58
    linux shell 可以用户定义方法(函数),然后在shell脚本中可以随便调用shell中函数的定义格式如下: [ function ] funname [()] { action; [return int;] } 注: 1、可以带function fun() 定义,也...
  • 简单介绍下传输参数的方法。 假设要向file.java传输参数, step1. 需要先生成.class文件: javac Test.java step2.在脚本中定义参数: int_a=5 double_b=3.0 string_c=aaa step3.传递参数: java Test $int_a $...
  • 以下只在BASH下测试在shell定义函数的方法为function func_name(){函数体[return]} 函数体部分可以是任意的Shell命令,也可以调用其他的函数。return后可跟数值0-255作为函数的返回值;如果不加,将以最后一条...
  • shell脚本函数声明,调用

    千次阅读 2018-09-20 09:55:18
    shell脚本中函数的声明, 调用,处理结果的返回等问题。  1. 函数声明 1.1 函数需要先声明后调用, 声明和调用有顺序要求。 1.2 shell中的函数返回值只能是数字, 返回0表示执行成功, 返回其他类型的值时会报错...
  • 假如有脚本 first.sh: #!/bin/bash #------------------ #@file:first.sh ...如何在其它Shell脚本中调用first.sh呢?主要有三种方法:source、点号以及sh命令。 1.source #!/bin/bash #-------------...
  • 可以传递参数给函数,由脚本进行访问:fname arg1 arg2; # 传递参数 以下是函数fname的定义。在函数fname中,包含了各种访问函数参数的方法。 代码如下:fname(){ echo $1, $2; # 访问参数1和参数2 echo “$@”; ...
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项
  • shell从函数文件中调用函数

    千次阅读 2014-06-23 11:06:33
    shell中函数有三种调用方式,一种是在文件前面定义函数,然后在下面直接调用;一种是通过载入shell,在shell中直接调用;第三种是将函数写入文件,然后在其他shell调用函数。 这里写一下关于第三种方法的例子: ...
  • Shell脚本中调用另外一个脚本的方法

    千次阅读 2016-06-29 19:17:09
    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件...我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork exec source。 1、fork ( /directory/script.sh) : 如果shell

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,904
精华内容 59,161
关键字:

shell定义方法并调用