目录

  • shell函数
  • 1.函数的作用
  • 2.函数的基本格式
  • 3.函数注意事项
  • 4.函数调用的方法
  • 5.函数的返回值
  • 6.函数的传参
  • 7.在外部调用函数
  • 8.函数变量的作用范围
  • 9.函数的递归
  • 10.函数库的作用



shell函数

1.函数的作用

  • 语句块定义成函数约等于别名,定义函数,再引用函数
  • 封装的可重复利用的具有特定功能的代码

2.函数的基本格式

法一:
[function] 函数名 (){
	命令序列
	[return x]         #使用return或者exit可以显式的结束函数
}
 
法二:
函数名(){
	命令序列
}

3.函数注意事项

1.直接写函数中调用

2函数直接写函数名同名函数后一个生效

3.调用函数一定要先定义

4.只要先定义了调用的其他函数,定义顺序无关

4.函数调用的方法

示例:

#!/bin/bash
h () {
echo "hello"
}
 
w () {
echo "world"
}
 
nihao () {
h
w
}
 
h
w
nihao

shell 函数跑spark_centos


示例:

#!/bin/bash
#递归环境变量PATH里包含的所有目录,显示所有目录下的子目录和文件

IFS_OLD=$IFS
IFS=$IFS':'
list() {
  for fd in $1/*
  do
    if [ -d $fd ];then
      echo "$fd 是目录"
      list "$fd"
    else
      echo "$fd 是文件"
    fi
  done
}

for dir in $PATH
do
  list $dir
done

IFS=$IFS_OLD

shell 函数跑spark_centos_02

  • 使用函数可以避免代码重复
  • 使用函数可以将大的工程分为若干小的功能模块,代码的可读性更强

5.函数的返回值

  • return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
  • 函数的使用原则
  • 1.函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
    2.退出状态码必须是0~255,超出时值将为除以256取余。
    示例:
#!/bin/bash
user () {
if [ $USER = root ]
 then echo "这是管理员用户"
else
echo "这不是管理员"
return 1
fi
}
user

shell 函数跑spark_运维_03

6.函数的传参

  • 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
  • 示例:
#!/bin/bash
sum () {
echo "第一个变量:" $1
echo "第二个变量:" $2
let n=$1+$2
echo $n
}
sum $2 $1

shell 函数跑spark_运维_04

7.在外部调用函数

  • 在外部调用命令需要先source一下。然后调用函数,再调用函数中的变量
[root@yxp data]#vim function.sh
#!/bin/bash
color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
END="\E[0m"
}

shell 函数跑spark_linux_05


示例:

在脚本中调用

shell 函数跑spark_运维_06

8.函数变量的作用范围

  • 函数在shell脚本中仅在当前shell环境中有效(除非使用source运行,在运行shell脚本中,是在一个子shell环境中运行的)
  • shell脚本中变量默认全局有效
  • 将变量限定在函数体内部使用local命令
  • 示例:
#!/bin/bash
aa () {
a=10
}
 
a=20
aa
echo $a

shell 函数跑spark_shell 函数跑spark_07

示例2:

#!/bin/bash
aa () {
local a=10
 
}
 
a=20
aa
echo $a

shell 函数跑spark_linux_08

9.函数的递归

  • 函数调用自己本身的函数(直到没有目录为止)
#!/bin/bash
#使用递归进行阶乘运算
fact () {
#判断传入的参数,如果是1,则直接输出1
if [ $1 -eq 1 ]
then
   echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
#如果传入的参数不是1,则函数调用函数自身,传入参数计算
echo $[$1 * $result]
fi
}
#####main######
read -p "请输入一个正整数:" num
result=$(fact $num)
echo "$num 的阶乘结果是:$result"
#fact 5
#递归分解
#5 temp=4 result=$(fact 4)   echo 5 * $(fact 4)
#fact 4

#4 temp=3 result=$(fact 3)   echo 5 * 4*$(fact 3)

#fact 3
#3 temp=2 result=$(fact 2)   echo 5 * 4*3$(fact 2)

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

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

shell 函数跑spark_linux_09

10.函数库的作用

  • 可以事先创建一个函数库文件,在里面定义各种常用的函数,然后可以在别的shell脚本中直接引用这个函数库文件,使得不需要再次定义函数即可直接调用函数
[root@localhost ~]# cat myfunctions.sh
#!/bin/bash
#创建函数库文件
jiafa(){
  echo $[$1 + $2]
}

jianfa(){
  echo $[$1 - $2]
}

chengfa(){
  echo $[$1 * $2]
}

chufa(){
  if [ $2 -eq 0 ];then
    echo "除数不能为0"
  else 
    echo $[$1 / $2]
  fi
}

fact(){
  if [ $1 -eq 1 ];then
    echo 1
  else
    local temp=$[$1 - 1]
    local result=$(fact $temp)
    echo $[$1 * $result]
  fi
}
#!/bin/bash
#调用函数库
  source ~/myfunctions.sh

v1=10
v2=5

res1=$(jiafa $v1 $v2)
res2=$(jianfa $v1 $v2)
res3=$(chengfa $v1 $v2)
res4=$(chufa $v1 $v2)
res5=$(fact $v1)

echo "加法结果为:$res1"
echo "减法结果为:$res2"
echo "乘法结果为:$res3"
echo "除法结果为:$res4"
echo "${v1}阶乘结果为:$res5"

shell 函数跑spark_shell 函数跑spark_10