shell函数

发布于:2023-01-01 ⋅ 阅读:(389) ⋅ 点赞:(0)

shell函数

shell函数的作用

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

shell函数的定义:


方法一:

function  函数名  {
          命令序列
}



方法二:

函数名 () {
   命令序列
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数的返回值:

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:

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

在这里插入图片描述

在这里插入图片描述

  • 利用函数输出两个数之和:

:q

在这里插入图片描述

  • 两个数之差:
    在这里插入图片描述

在这里插入图片描述

  • 两个数之差(更换$1与$2的位置):
    在这里插入图片描述

在这里插入图片描述

利用函数将十进制转换为二进制

在这里插入图片描述

在这里插入图片描述

使用函数输出菱形,并且实现可通过输入数值的大小来伸缩菱形的大小

在这里插入图片描述

在这里插入图片描述

函数变量的作用范围

  • 函数在shell脚本中仅在当前shell环境中有效

  • shell脚本中变量默认全局有效
    在这里插入图片描述
    在这里插入图片描述

  • 将变量限定在函数内部使用local命令

#!/bin/bash

myfun() {
   echo $i
    i=8
   echo $i
}

i=9
myfun
echo $i



[root@localhost yy]#bash yy15.sh 
9
8
8

#!/bin/bash

myfun() {
   echo $i
   local i=8    # 将变量限定在函数内部
   echo $i
}

i=9
myfun
echo $i


[root@localhost yy]#bash yy15.sh 
9
8
9



递归

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

阶乘

在这里插入图片描述
在这里插入图片描述

使用递归求阶乘

#!/bin/bash

fact () {
  num=$1
  if [ $num -eq 1 ];then      #判断获取的变量值是否为1.若为1,直接输出结果1
    echo 1
  else
    temp=$[num - 1]
    local result=$(fact $temp)
    echo $[num * result]      # 5*$result (4*$result (3*$result (2*result(1) )))
  fi
}

###### main #######
read -p "请输入一个正整数:" n
result=$(fact $n)
echo "$n阶乘的值为$result"

result=$(fact $temp)  过程:

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

在这里插入图片描述

递归目录

例题:使用循环的方法把/var/log 目录下的文件和目录区分出来并输出

#!/bin/bash

list_dir() {
  for dir in $(ls $1)  #for循环遍历目标目录
  do
    if [ -d $dir ];then   #判断是否为目录
      echo "$dir 为目录:"
      list_dir "$dir" "  $2"     #再次调用本函数遍历这个子目录。$2的使用是为了形成层级效果,没进行一次递归,输出前面就会多两个空格
    else
      echo "$dir 为文件"
    fi
  done
}
主代码调用函数
######## main ########

list_dir "/var/log" "" #由于函数中定义了位置变量$2,所以需要这个空的参数在这 

在这里插入图片描述

创建函数库

在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到