zoukankan      html  css  js  c++  java
  • linux——shell:函数

    一、语法

    function: function name { COMMANDS ; } or name () { COMMANDS ; }
        Define shell function.
        
        Create a shell function named NAME.  When invoked as a simple command,
        NAME runs COMMANDs in the calling shell's context.  When NAME is invoked,
        the arguments are passed to the function as $1...$n, and the function's
        name is in $FUNCNAME.
        
        Exit Status:
        Returns success unless NAME is readonly.
    

    1、创建函数“

    写法1:

    f_name(){
    	...函数体...
    }
    

    写法2:

    function f_name{
    	...函数体...
    }
    

    写法3:

    function f_name (){
    	...函数体...
    }
    
    示例:
    pi@raspberrypi:~ $ func_test(){ echo test function; }
    pi@raspberrypi:~ $ func_test 
    test function
    

    2、删除函数:

    pi@raspberrypi:~ $ unset func_test   #删除函数
    pi@raspberrypi:~ $ func_test 
    -bash: func_test: command not found
    

    3、变量作用范围

    3.1本地变量:local
    作用范围:本地变量只能在函数内部定义,并且只在函数内部有效
    [18:13:55 root@centos7 data]#num=200;func_test(){ num=100;echo $num; }
    [18:14:36 root@centos7 data]#func_test 
    100
    [18:14:44 root@centos7 data]#echo $num
    100				#函数内定义的普通变量,会影响了函数外变量的值
    [18:14:56 root@centos7 data]#
    #定义本地变量
    [18:14:56 root@centos7 data]#num=200;func_test(){ local num=100;echo $num; }
    [18:17:44 root@centos7 data]#func_test 
    100
    [18:17:50 root@centos7 data]#echo $num
    200				#函数内使用关键字local生成的本地变量,只在本函数内有效
    
    3.2普通变量:
    作用范围:当前用户有效,切换用户后失效
    #变量名=值,直接定义
    [18:28:56 root@centos7 data]#num=300 
    
    3.3环境变量:
    作用范围:当前shell范围内有全局有效,切换用户仍有效。
    环境变量定义:
    [18:23:14 root@centos7 data]#export TX=1  #方法1
    [18:25:47 root@centos7 data]#declare -x TX2=2	#方法2
    
    /etc/profile里存放的环境变量对于所有用户都有效。不管你是用什么用户登陆。
    用户可以修改家目录下的.bashrc文件进行自定义。
    

    4、匿名函数:

    {echo x; escho y;} #只有函数体,没有f_name{},用于临时使用
    

    5、查询系统环境中定义的函数

    delare -f		#显示系统中定义的函数名,及函数定义
    delare -F		#仅显示系统中定义的函数名
    

    二、函数调用

    2.1、脚本中创建函数,并直接调用:

    2.2、引用文件中函数:

    [14:33:08 root@centos7 data]#vim funcs.sh    #创建函数
    #/bin/bash
    func_os_version(){
    	sed -nr 's/.*([0-9]+)..*/1/p' /etc/redhat-release
    }
    #编写脚本
    [14:34:03 root@centos7 data]#vim func_reference.sh   
    #!/bin/bash
    source funcs.sh		#引用函数文件
    echo "system version `func_os_version`" #调用函数
    #执行脚本
    [14:34:35 root@centos7 data]#bash func_reference.sh 
    system version 7
    

    3、参数传递:

    用$和数字接收传递的参数。 见练习1.2

    $# 是传给脚本的参数个数
    $0 是脚本本身的名字
    $1 是传递给该shell脚本的第一个参数
    $2 是传递给该shell脚本的第二个参数
    $@ 是传给脚本的所有参数的列表
    $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
    $$ 是脚本运行的当前进程ID号
    $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
    

    4、return:返回值

    见练习1.2

    5、递归:

    #函数自己调用自己
    #计算10的阶乘,#n!=1×2×3×...×(n-1)×n
    fact(){
    	if [ $1 -eq 0 ];then
    		echo 1
    	else
    		echo $[`fact $[$1-1]`*$1]
    	fi
    }
    fact $1  #调用
    #执行
    [19:30:56 root@centos7 data]#./fact.sh 7
    5040
    #下面的代码,同学可是试一下
    .(){ .|.& };.
    

    三、练习

    1.1获取系统版本号
    #!/bin
    func_os_version(){
    	sed -nr 's/.*([0-9]+)..*/1/p' /etc/redhat-release
    }
    echo Os version is `func_os_version`
    
    1.2判断是否为数字
    [15:34:31 root@centos7 datavim func.sh  创建函数库
    #判断是否为数字
    func_is_digit(){
    	if [ ! "$1" ];then
    		echo "Usage:func_is_digit number"
    		return 10  #返回10 没有传递参数
    	elif [[ $1 =~ ^[[:digit:]]+$ ]];then
    		return 0	#为数字
    	else
    		return 1
    	fi
    }
    #调用函数
    #!/bin/bash
    source funcs.sh  #引用函数
    read -p "输入数字-->" num
    func_is_digit $num #函数传递参数
    flag=$?	#保存函数返回值
    if [ $flag -eq 1 ];then
    	echo "不是数字"
    elif [ $flag -eq 0 ];then
    	echo “是数字”
    else
    	echo !!!
    fi
    
  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/franc/p/12555447.html
Copyright © 2011-2022 走看看