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
    
  • 相关阅读:
    win10 Administrator
    笔记
    一步一步建MVC
    安装mysql数据库
    为什么工具监测不出内存泄漏
    实现客户端服务端编译分离
    session
    JavasScript基数排序
    asp.net C# 导出EXCEL数据
    (Excel导出失败)检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失
  • 原文地址:https://www.cnblogs.com/franc/p/12555447.html
Copyright © 2011-2022 走看看