函数的简单使用

发布于:2024-06-18 ⋅ 阅读:(151) ⋅ 点赞:(0)

函数

shell的函数

函数的定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。

for i in {}
do
  命令序列
done

函数作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。

购物

展示

结算

支付

物流

函数的两种格式:

function shoping {
 命令序列
}
shoping () {
   命令序列
}

第一种格式的使用方法

function abc {
   num=$(($a*2))
   sum=$(($a+10))
   echo $num
}
read -p "" a
abc
echo $sum

将函数里的值传到函数外

function abc {
  read -p "请输入一个数:" num
  if [ $num -eq $num ] &> /dev/null
  then
  num=$(($num*2))
  return 0
  else
   return 1
  fi
}
abc
echo $num
if [ $? -eq 0 ]
then
echo "ok"
else
exit
fi
#return的作用,return只能写在函数的内部,目的是从函数的内部获取一个返回值,用来判断是否继续执行下一个脚本。
#echo $? 这个时候不再是判断执行结果,只是一个函数内部的返回值
#在使用return传回返回码的时候,默认0是成功,非0都是失败。返回码可以自定义,范围0~255。
#函数的传参方式以及函数变量的作用范围:
sum () {
 num=$(($1+$2))
 echo $num
}
sum $1 $2
[root@localhost opt]# sh hanshu2.sh 10 20
30
#函数的传参方式以及函数变量的作用范围:
abc () {
 local a=5
 b=6
}
a=8
b=9
abc
echo $a
echo $b
#在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的
#加了local之后就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值

递归:

#函数递归:函数调用自己本身的函数
#阶乘 4的阶乘 4 3 2 1=24 
#用函数递归的方式来实现阶乘
jiecheng () {
  if [ $1 -eq 1 ]
  then
   echo 1
  else
   local temp=$(($1-1))
   local result=$(jiecheng $temp)
   echo "$(($1*$result))"
  fi
}
read -p "输入一个数:" num
result1=`jiecheng $num`
echo $result1
#递归目录。把/etc目录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则就继续打印,直到目录里没有文件为止
digui () {
  for file in `ls $1`
  do
    if [ -d "$1/$file" ]
    then
      echo $file 
      digui "$1/$file"
    else
      echo "$file"
    fi
  done
}
digui $1

函数的格式:

[root@localhost opt]# vim hanshu5.sh
#函数库,函数库中只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数。
jiafa () {
 result=$(echo "scale=2;$1+$2" | bc )
 echo $result
}
jianfa () {
 result=$( echo "scale=2;$1-$2" | bc)
 echo $result
}
chengfa () {
 result=$( echo "scale=2;$1*$2" | bc)
 echo $result
 }
​
. /opt/hanshu5.sh
read -p "输入第一个数:" num1
read -p "输入第二个数:" num2
[root@localhost opt]# vim diaoyong.sh 
sum=`jiafa $num1 $num2`
sub=`jianfa $num1 $num2`
mult=`chengfa $num1 $num2`
​
echo "$num1+$num2=" $sum
echo "$num1-$num2=" $sub
echo "$num1*$num2=" $mult
#递归目录。把/etc目录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则就继续打印,直到目录里没有文件为止
#把后缀名是.txt的文件复制到/opt/dec当中
digui () {
  for file in `ls $1`
  do
    if [ -d "$1/$file" ]
    then
      digui "$1/$file"
    else
         if [[ "$file" == *.txt ]]
         then
           cp "$1/$file" /opt/dec/
         fi
​
      echo "$1/$file"
    fi
  done
}
digui $1