zoukankan      html  css  js  c++  java
  • 【Linux】【Shell】【Basic】函数

    1. 函数:function,把一段独立功能的代码当作一个整体,并为之一个名字;命名的代码段,此即为函数;
    注意:定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,在代码中给定函数名即可;
        函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码;
                     
            语法一:
                function  f_name  {
                    ...函数体...
                }
                 
            语法二:
                f_name()  {
                    ...函数体...
                }
                 
    2. 函数的生命周期:每次被调用时创建,返回时终止;
      其状态返回结果为函数体中运行的最后一条命令的状态结果;
      自定义状态返回值,需要使用:return
        return [0-255]
          0: 成功
          1-255: 失败
                     
    示例:给定一个用户名,取得用户的id号和默认shell;
    #!/bin/bash
    #
    
    userinfo() {
    	if id "$username" &> /dev/null; then
    		grep "^$username>" /etc/passwd | cut -d: -f3,7
    	else
    		echo "No such user."
    	fi
    }
    
    username=$1
    userinfo
    
    username=$2
    userinfo
    

      

    示例2:服务脚本框架
    #!/bin/bash
    #
    # chkconfig: - 50 50
    # description: test service script
    #
    prog=$(basename $0)
    lockfile=/var/lock/subsys/$prog
    
    start() {
    	if [ -f $lockfile ]; then
    		echo "$prog is running yet."
    	else
    		touch $lockfile
    		[ $? -eq 0 ] && echo "start $prog finshed."
    	fi
    }
    
    stop() {
    	if [ -f $lockfile ]; then
    		rm -f $lockfile
    		[ $? -eq 0 ] && echo "stop $prog finished."
    	else
    		echo "$prog is not running."
    	fi
    }
    status() {
    	if [ -f $lockfile ]; then
    		echo "$prog is running"
    	else
    		echo "$prog is stopped."
    	fi
    }
    
    usage() {
    	echo "Usage: $prog {start|stop|restart|status}"
    }
    
    case $1 in
    start)
    	start ;;
    stop)
    	stop ;;
    restart)
    	stop
    	start ;;
    status)
    	status ;;
    *)
    	usage
    	exit 1 ;;
    esac
    

      

    3. 函数返回值:
      函数的执行结果返回值:
        (1) 使用echo或printf命令进行输出;
        (2) 函数体中调用的命令的执行结果;
      函数的退出状态码:
        (1) 默认取决于函数体中执行的最后一条命令的退出状态码;
        (2) 自定义:return
                     
      函数可以接受参数:
        传递参数给函数:
          在函数体中当中,可以使用$1,$2, ...引用传递给函数的参数;还可以函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
          在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc  arg1 arg2 arg3 ...
                     
    示例:添加10个用户,添加用户的功能使用函数实现,用户名做为参数传递给函数;
    #!/bin/bash
    #
    # 5: user exists
    
    addusers() {
    	if id $1 &> /dev/null; then
    		return 5
    	else
    		useradd $1
    		retval=$?
    		return $retval
    	fi
    }
    
    for i in {1..10}; do
    	addusers ${1}${i}
    	retval=$?
    	if [ $retval -eq 0 ]; then
    		echo "Add user ${1}${i} finished."
    	elif [ $retval -eq 5 ]; then
    		echo "user ${1}${i} exists."
    	else
    		echo "Unkown Error."
    	fi
    done
    

      

    练习:写一个脚本;
      使用函数实现ping一个主机来测试主机的在线状态;主机地址通过参数传递给函数;
      主程序:测试172.16.1.1-172.16.67.1范围内各主机的在线状态;
                 
    练习:写一个脚本;
      打印NN乘法表;
                 
             
    4. 函数递归:函数直接或间接调用自身;
                     
    示例:10!=10*9!=10*9*8!=10*9*8*7!=...
      n
      n*(n-1)!=n*(n-1)*(n-2)!=
    #!/bin/bash
    #
    fact() {
    	if [ $1 -eq 0 -o $1 -eq 1 ]; then
    		echo 1
    	else
    		echo $[$1*$(fact $[$1-1])]
    	fi
    }
    
    fact $1
    

      

    示例:1,1,2,3,5,8,13,21,...
     
    #!/bin/bash
    #
    fab() {
    	if [ $1 -eq 1 ]; then
    		echo -n "1 "
    	elif [ $1 -eq 2 ]; then
    		echo -n "1 "
    	else
    		echo -n "$[$(fab $[$1-1])+$(fab $[$1-2])] "
    	fi
    }
    
    for i in $(seq 1 $1); do
    	fab $i
    done
    echo
    

      

  • 相关阅读:
    ElasticSearch 概念解析
    CSS Selector (part 1)
    ruby 把字符串转为正则匹配表达式
    SQL ISNULL应用
    logstash input jdbc连接数据库
    Logstash add_field 参数应用
    函数返回局部变量/局部指针
    内存四区模型
    释放内存触发断点及数组、指针的NULL初始化
    动态分配内存
  • 原文地址:https://www.cnblogs.com/demonzk/p/6297317.html
Copyright © 2011-2022 走看看