Shell编程之函数

Shell编程之函数

  • Shell函数

    • 将命令序列按格式写在一起
    • 可方便重复使用命令序列
  • Shell函数定义

    [1]
    # 定义函数
    function 函数名 {
    	命令序列
    }
    
    [2]
    函数名() {
    	命令序列
    }
    
    ########## main ##########
    # 调用函数
    函数名
    
    #!/bin/bash
    # 创建用户的函数
    
    user() {
    	useradd $name
    	echo 123456 | passwd --stdin $name
    }
    
    read -p "请输入要创建的用户名:" name # 用户输入用户名
    
    user # 调用函数
    
  • 函数返回值

    • return表示退出函数并返回一个退出值,脚本中可以使用$?变量显示该值
    • 使用原则
      • 函数一结束就取返回值,因为$?变量值返回执行的最后一条命令的退出状态码
      • 退出状态码必须是0~255,超出时值将为该值除以256的取余值
    #!/bin/bash
    
    function test {
    	read -p "请输入一个数值:" num
    	return $[ $num * 2]
    }
    
    test1() {
    	read -p "请输入:" value
    	echo $[$value * 2]
    }
    
    ##### main #####
    result=$(test1)
    echo $result
    
    test
    echo $?
    
  • 函数传参

    • 函数体外的位置变量是运行脚本时传入的位置变量
    • 函数体内的位置变量是调用函数时传入的位置变量
    #!/bin/bash
    
    sum1() {
    	sum=$[$1 +$2]
    	echo $sum
    }
    
    ########## main ##########
    read -p "请输入第一个位置参数" first
    read -p "请输入第二个位置参数" second
    
    result=$(sum1 $first $second)
    echo $result
    
  • 函数变量的作用范围

    linux的全局变量和局部变量

    • 全局变量:变量作用于整个操作系统所有用户的shell环境内

    • 局部变量:变量只作用于当前shell环境内

    shell脚本的全局变量和局部变量

    • 全局变量:作用于shell脚本当前的整个shell环境内,包括所有函数体内或函数体外
    • 局部变量:作用于shell脚本当前的shell环境内,仅限制于某个函数体内

    在函数体内设置局部变量

    • local 变量名=……
    • 函数在shell脚本中仅在当前shell环境中有效(除非是用的source)
    • Shell脚本中变量默认全局有效
    • 使用local命令将变量限定在函数内部
    #!/bin/bash
    
    myfun() {
    	echo $i   # 8
    	local i
    	i=9
    	echo $i   # 9
    }
    i=8
    myfun
    echo $i   # 8
    
  • 递归

    • 函数调用自己本身的函数

    • 阶乘

      #!/bin/bash
      
      fact() {
      	if [ $1 -eq 1 ] #输入为1时直接输出1
      	then
      		echo 1
      	else
      		local temp=$[$1 -1]
      		local result=$(fact $temp) #调用自身且$1为temp的值实现递归调用
      		echo $[$1 * $result]
      			# 相当于5*$result(4*$result(3*$result(2*$result(1))))
      	fi
      }
      
      ########## main ##########
      
      read -p "请输入一个要阶乘的数值:" n
      
      result=$(fact $n)
      
      echo $result
      
    • 递归目录

      #!/bin/bash
      
      function list_files {
      	for f in `ls $1`
      	do
      		if [ -d "$1/$f" ]
      		then
      			echo "目录:$2$f"
      			list_files "$1/$f" " $2"
      		else
      			echo "文件:$2$f"
      		fi
      	done
      }
      
      ########## main ##########
      # 递归查看指定目录
      ## 第一个位置变量用于判断是目录或者文件,第二个位置变量用于给子目录或者子文件实现缩进
      list_files "/var/log" ""
      
    • 创建库

      vim myfuncs.sh

      # 一个简单的加减乘除阶乘的库
      addition() { #加法
      	echo $[$1 + $2]
      }
      
      multiplication() { #乘法
      	echo $[$1 * $2]
      }
      
      subtraction() { #减法
      	ecno $[$1 - $2]
      }
      
      division() { #除法
      	if [ $2 -ne 0 ];then
      		echo $[$1 /$2]
      	else
      		echo "0 不能作为除数"
      	fi
      }
      
      Factorial() { #阶乘
      	if [ $1 -eq 1 ];then
      		echo 1
      	elif [ $1 -eq 0 ];then
      		echo 0
      	else
      		local temp=$(subtraction $1 1)
      		local result=$(fact $temp)
      		echo $[$1 * $result]
      		echo $(multiplication $1 result)
      	fi
      }
      
    • vim test.sh #编写测试脚本

      #!/bin/bash
      
      . /opt/myfuncs.sh
      
      v1=10
      v2=2
      
      resl=$(addition $v1 $v2)
      res2=$(subtraction $v1 $v2)
      res3=$(multiplication $v1 $v2)
      res4=$(division $v1 $v2)
      res5=$(Factorial $v1 $v2)
      
      echo "加法的结果是:$res1"
      echo "减法的结果是:$res2"
      echo "乘法的结果是:$res3"
      echo "除法的结果是:$res4"
      echo "阶乘的结果是:$res5"
      

你可能感兴趣的:(Shell脚本,bash,linux,开发语言,shell,运维)