Shell编程之函数

Posted Richard_Chiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程之函数相关的知识,希望对你有一定的参考价值。

Shell编程之函数

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

Shell函数定义:

方法一:

#!/bin/bash
#定义函数①
function 函数名 
  命令序列

######## main ########
#调用函数

例:
#!/bin/bash
#定义的函数
function hello 
  echo "hello world"

######## main ########
#调用的函数
hello

方法二:

#!/bin/bash
#定义函数②
函数名 () 
  命令序列

######## main ########
#调用函数

例:
#!/bin/bash
user () 
  useradd $name
  echo 123456 | passwd --stdin $name

######## main ########
read -p "请输入要创建的用户名:" name
#调用函数
user

函数返回值

return表示退出函数并返回一个退出值,脚本中可以用echo $?变量显示该值,return 1 退出函数并返回,返回值为1

使用原则:

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  • 退出状态码必须是0~255, 超出时值将为除以256取余

示例

#!/bin/bash
function test 
  read -p "请输入一个数值:" num
  return $[$num * 2]

######## main ########
test
echo $?
[root@localhost data]# bash demo1.sh 
请输入一个数值:100
200

#最大不能超过255的范围,如果需要则必须调用echo,所以:
test () 
  read -p "请输入一个数值:" num
  echo $[$num * 2]

######## main ########
result=$(test)
echo $result
[root@localhost data]# bash demo1.sh 
请输入一个数值:300
600

1.形式

形参:定义一个函数void add(int a, int b),这里的a和b就是形参。

实参:当你进行函数调用的时候,add(1, 2),这里的1和2就是实参

2.使用

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

Shell的函数传参

函数传参:
sum1 () 
  sum=$[$1 + $2]
  echo $sum

######## main ########
read -p "输入第一个参数: " first
read -p "输入第二个参数: " second
result=$(sum1 $first $second)
echo $result
[root@localhost data]# bash demo2.sh 
输入第一个参数: 10
输入第二个参数: 20
30

//如果用此方法写函数体外的$1$2与函数体内的$1$2是有区别的
#!/bin/bash
sum1 () 
  sum=$[$1 + $2]  #而此时的$1与$2对应的是函数体内的$1与$4
  echo $sum

######## main ########
result=$(sum1 $1 $4 $2] 
//此时$1会把10当作函数体内的第一个变量,接着对应着函数体外的$2为函数体内的$4,对应下面数字的10与40
echo $result
[root@localhost data]# bash demo2.sh 10 20 30 40 
50

函数变量的作用范围

  • 函数在Shell脚本中仅在当前Shell环境中有效(source会影响当前shell的环境)
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令(设置为局部变量)
#!/bin/bash
myfun() 

echo $i
local i=9   #local命令设置为局部变量仅仅是在函数体内的有效,出了函数就无效了
echo $i


i=8
myfun
echo $i
[root@localhost data]# bash demo3.sh 
8
9
8

补:两种全局变量域局部变量

Linux 全局变量 局部变量

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

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

shell脚本 全局变量 局部变量

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

局部变量:作用于shell脚本当前的shell环境内,仅限制于某个函数体内

函数的递归

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

阶乘

#!/bin/bash
fact() 
  if [ $1 -eq 1 ]
  then
    echo 1
   else
     local temp=$[$1 - 1]
     local result=$(fact $temp)
     echo $[$1 * $result]
   fi

######## main ########
read -p "请输入一个要阶乘的数值:" n
result=$(fact $n)
echo "$n的阶乘结果为:$result"
[root@localhost data]# bash demo4.sh
请输入一个要阶乘的数值:5
5的阶乘结果为:120

具体操作流程:

n=5 fact 5
fact() $1=5 temp=5-1=4 result=$(fact 4) echo 5 * $(fact 4)
$1=4 temp=4-1=3 result=$(fact 3) echo 5 4 $(fact 3)
$1=3 temp=3-1=2 result=$(fact 2) echo 5 4 3 * $(fact 2)
$1=2 temp=2-1=1 result=$(fact 1) echo 5 4 3 2 $(fact 1)
$1=1 $(fact 1)=1 echo 5 4 3 2 1

递归目录

#!/bin/bash
file_list() 
  for f in $(ls $1)
  #遍历指定目录或者子目录的所有文件
  do
    if [ -d "$1/$f" ]         
    #$f代表目录名如果是目录则输出目录名称
    then
      echo "目录:$2$f"        
      #递归调用函数判断子目录里的文件或者目录,并且输出时进行缩进
      file_list "$1/$f" " $2"  #此时$2没有值;$2输出子目录与文件时进行缩进
    else                      
      #如果是子目录里的文件输出是进行缩进
      echo "文件:$2$f"                   
    fi
  done

######## main ########
#递归查看指定目录相当于ls -R
#第一个位置变量用于判断是目录或者文件
#第二个位置变量用于给子目录或者文件实现位移(缩进)用的
file_list "/var/log" ""

定义函数创建库

//创建库内容
vim myfuncs.sh
#加法
jiafa() 
  echo $[$1 + $2]

#减法
jianfa() 
  echo $[$1 - $2]

#乘法
chengfa() 
  echo $[$1 * $2]

#除法
chufa() 
  if [ $2 -ne 0 ];then
    echo $[$1 / $2]
  else
    echo "0 不能作为除数"
  fi

#阶乘
fact() 
  if [ $1 -eq 1 ];then
    echo 1
  elif [ $1 -eq 0 ];then
    echo 0
  else
    local temp=$(jianfa $1 1) 
    local result=$(fact $temp)
    #echo $[$1 * $result]或:
    echo $[chengfa $1 $result]
  fi

//使用如下:
vim test.sh
. myfuncs.sh或source myfuncs.sh

v1=$1
v2=$2
result1=$(jiafa $v1 $v2)
result2=$(jianfa $v1 $v2)
result3=$(chengfa $v1 $v2)
result4=$(chufa $v1 $v2)
result5=$(fact $v1 $v2)

echo "加法结果为: $result1"
echo "减法结果为: $result2"
echo "乘法结果为: $result3"
echo "除法结果为: $result4"
echo "阶乘结果为: $result5"

以上是关于Shell编程之函数的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之函数

shell编程之函数和case多条件分支语句

shell编程之函数

shell编程之函数

linux——shell编程之函数和循环控制

Shell之函数