C04S04-Shell编程之函数

Shell脚本函数的使用与递归

一、函数

1. 函数概述

函数是把相对独立的代码写在一起形成代码块,可以重复调用。通过函数,可以将一个较大的工程项目分为若干个小模块。

2. 函数语法

  1. 函数语法一

    function 函数名 {
      # 执行的代码
    }
    
    # 函数的调用
    函数名
    
  2. 函数语法二

    函数名 (){
      # 执行的代码
    }
    
    # 函数的调用
    函数名
    

3. 函数返回值

在Shell脚本中,可以通过return来设置函数的返回值,返回函数的退出状态码。

return的使用原则:

  • 函数一结束,就取返回值。
  • return语句的范围是0~255,一旦超出范围就会除以256来取余。

return的意义是在函数的内部做控制流程,将最后的状态码告诉给调用者,告诉调用者函数的执行情况。调用者再根据函数的这些情况来选择后续代码的具体操作。return的返回值可以自定义,所以调用者可以根据不同的返回值来进行选择判断。

4. 函数传参

  1. 函数传参的语法

    函数名 (){
      # 执行的代码
    }
    
    函数名 参数
    
    • 函数中要设置位置变量,根据调用函数时设置的参数来进行传参。

5. 函数的作用范围

  1. Shell脚本中定义的变量默认是全局变量(gobal),也就是在整个脚本环境中有效;从变量的定义声明开始,一直到脚本结束都有效,除非显式删除变量。
  2. 要想把变量的有效范围限制在函数里,那么需要使用local来定义声明局部变量。
  3. 如果gobal变量和local变量同名,local变量会优先于gobal变量,直至函数结束。
  4. 函数只在当前脚本环境中有效,也就是函数的声明和调用要在同一个文件。

6. 函数的递归

递归就是在一个函数当中调用函数本身。函数主要作用就是实现某一功能的代码的重复利用,函数递归也是如此。主要用于解决有着与其相似子问题的问题。问题的规模会不断减小,直到一个问题的基本情况,这个问题可以直接解决,而不用进一步递归。

函数递归主要分为基本代码部分和递归代码部分。基本部分是递归的终止条件,当符合某个条件时候,就会直接输出或返回某值而不递归调用;递归部分也就是调用函数自身,函数的输入会逐渐接近基本条件,直到符合基本条件终止递归。

计算阶乘,就是一个典型的函数递归。

#! /bin/bash

func1 ()
{
  if [ $1 -eq 1 ]
  then
    echo 1
  else
    local temp=$(($1 - 1))
    local result=$(func1 $temp)

    echo "$(($1 * result))"
  fi
}

read -p "请输入一个数字:" num

func1 $num
帮忙分析如下问题:[2025-09-15 18:28:32] Unable to handle kernel NULL pointer dereference at virtual address 00000040 [2025-09-15 18:29:41] pgd = c0014000 [2025-09-15 18:29:41] [00000040] *pgd=00000000 [2025-09-15 18:29:41] Internal error: Oops: 17 [#1] PREEMPT SMP ARM [2025-09-15 18:29:41] Unable to handle kernel NULL pointer dereference at virtual address 000001a4 [2025-09-15 18:30:05] Unable to handle kernel paging request at virtual address b93fe868 [2025-09-15 18:30:05] pgd = c0014000 [2025-09-15 18:30:05] [b93fe868] *pgd=00000000 [2025-09-15 18:30:05] [fkb_pctl_check:4511]Leave a fkb to the default Linux stack [2025-09-15 18:30:06] [fkb_pctl_check:4511]Leave a fkb to the default Linux stack [2025-09-15 18:30:06] [fkb_pctl_check:4511]Leave a fkb to the default Linux stack [2025-09-15 18:30:06] ##########[ndisc_router_discovery 1320] eth1 recv Router Advertisement [2025-09-15 18:30:06] NMI watchdog: BUG: soft lockup - CPU#2 stuck for 23s! [swapper/2:0] [2025-09-15 18:30:06] Modules linked in: domain_dns(O) init_addr( (null) - (null)), core_addr(bf379000 - bf37a538) [2025-09-15 18:30:06] qos_kctl(O) init_addr( (null) - (null)), core_addr(bf03a000 - bf03a03c) [2025-09-15 18:30:06] traffic_control(O) init_addr( (null) - (null)), core_addr(bf03e000 - bf03e3d4) [2025-09-15 18:30:06] safesearch_dns(PO) init_addr( (null) - (null)), core_addr(bf76b000 - bf76e6b8) [2025-09-15 18:30:06] app_dpi(O) init_addr( (null) - (null)), core_addr(bf8af000 - bf8b371c) [2025-09-15 18:30:06] xt_pctl(O) init_addr( (null) - (null)), core_addr(bf89f000 - bf8a70c0) [2025-09-15 18:30:06] blockingx(O) init_addr( (null) - (null)), core_addr(bf777000 - bf77a474) [2025-09-15 18:30:06] wl(P) init_addr( (null) - (null)), core_addr(bf3af000 - bf5b9830) [2025-09-15 18:30:06] neighbor_discover(O) init_addr( (null) - (null)), core_addr(bf3a3000 - bf3a61bc) [2025-09-15 18:30:06] tp_dhcp_hook(O) init_addr( (null) - (null)), core_addr(bf39e000 - bf39f044) [2025-09-15 18:30:06] client_recognition(O) init_addr( (null) - (null)), core_addr(bf389000 - bf389560) [2025-09-15 18:30:06] app_classifier(O) init_addr( (null) - (null)), core_addr(bf383000 - bf3856f0) [2025-09-15 18:30:06] domain_libs(O) init_addr( (null) - (null)), core_addr(bf377000 - bf37746c) [2025-09-15 18:30:06] nf_conntrack_netlink init_addr( (null) - (null)), core_addr(bf36f000 - bf37335c) [2025-09-15 18:30:06] nf_conntrack_ipv6 init_addr( (null) - (null)), core_addr(bf36a000 - bf36ad64) [2025-09-15 18:30:06] nf_defrag_ipv6 init_addr( (null) - (null)), core_addr(bf363000 - bf363d74) [2025-09-15 18:30:06] ipt_TRIGGER(O) init_addr( (null) - (null)), core_addr(bf35f000 - bf35f4ec) [2025-09-15 18:30:06] xt_V6PORTS(O) init_addr( (null) - (null)), core_addr(bf35b000 - bf35bd04) [2025-09-15 18:30:06] xt_LOOPBACKDNAT(O) init_addr( (null) - (null)), core_addr(bf357000 - bf3577f8) [2025-09-15 18:30:06] xt_CHECKPORTS(PO) init_addr( (null) - (null)), core_addr(bf353000 - bf3531a8) [2025-09-15 18:30:06] nf_nat_tftp init_addr( (null) - (null)), core_addr(bf34f000 - bf34f07c) [2025-09-15 18:30:06] nf_conntrack_tftp init_addr( (null) - (null)), core_addr(bf34b000 - bf34b1a4) [2025-09-15 18:30:06] nf_nat_snmp_basic init_addr( (null) - (null)), core_addr(bf346000 - bf3472d4) [2025-09-15 18:30:06] nf_conntrack_snmp init_addr( (null) - (null)), core_addr(bf342000 - bf342080) [2025-09-15 18:30:06] nf_nat_sip init_addr( (null) - (null)), core_addr(bf33d000 - bf33e4f4) [2025-09-15 18:30:06] nf_conntrack_sip init_addr( (null) - (null)), core_addr(bf336000 - bf338908) [2025-09-15 18:30:06] nf_nat_pptp init_addr( (null) - (null)), core_addr(bf332000 - bf3323a8) [2025-09-15 18:30:06] nf_conntrack_pptp init_addr( (null) - (null)), core_addr(bf32e000 - bf32e878) [2025-09-15 18:30:06] nf_nat_h323 init_addr( (null) - (null)), core_addr(bf329000 - bf329dbc) [2025-09-15 18:30:06] nf_conntrack_h323 init_addr( (null) - (null)), core_addr(bf31d000 - bf32054c) [2025-09-15 18:30:06] nf_nat_proto_gre init_addr( (null) - (null)), core_addr(bf319000 - bf31912c) [2025-09-15 18:30:06] nf_conntrack_proto_gre init_addr( (null) - (null)), core_addr(bf315000 - bf315644) [2025-09-15 18:30:06] nf_nat_amanda init_addr( (null) - (null)), core_addr(bf311000 - bf311120) [2025-09-15 18:30:06] nf_conntrack_amanda init_addr( (null) - (null)), core_addr(bf30d000 - bf30d2d4) [2025-09-15 18:30:06] nf_conntrack_broadcast init_addr( (null) - (null)), core_addr(bf30b000 - bf30b174) [2025-09-15 18:30:06] nf_nat_irc init_addr( (null) - (null)), core_addr(bf307000 - bf307158) [2025-09-15 18:30:06] nf_conntrack_irc init_addr( (null) - (null)), core_addr(bf303000 - bf303448) [2025-09-15 18:30:06] nf_nat_ftp init_addr( (null) - (null)), core_addr(bf2ff000 - bf2ff1fc) [2025-09-15 18:30:06] nf_conntrack_ftp init_addr( (null) - (null)), core_addr(bf2fa000 - bf2faa30) [2025-09-15 18:30:06] xt_iprange init_addr( (null) - (null)), core_addr(bf2f6000 - bf2f6220) [2025-09-15 18:30:06] xt_quota init_addr( (null) - (null)), core_addr(bf2f2000 - bf2f20e0) [2025-09-15 18:30:06] xt_pkttype init_addr( (null) - (null)), core_addr(bf2ee000 - bf2ee09c) [2025-09-15 18:30:06] xt_owner init_addr( (null) - (null)), core_addr(bf2ea000 - bf2ea114) [2025-09-15 18:30:06] compat_xtables(O) init_addr( (null) - (null)), core_addr(bf2e8000 - bf2e8064) [2025-09-15 18:30:06] xt_REDIRECT init_addr( (null) - (null)), core_addr(bf2e4000 - bf2e406c) [2025-09-15 18:30:06] xt_NETMAP init_addr( (null) - (null)), core_addr(bf2e0000 - bf2e01f8) [2025-09-15 18:30:06] xt_nat init_addr( (null) - (null)), core_addr(bf2dc000 - bf2dc200) [2025-09-15 18:30:06] nf_nat_redirect init_addr( (null) - (null)), core_addr(bf2da000 - bf2da174) [2025-09-15 18:30:06] ipt_MASQUERADE init_addr( (null) - (null)), core_addr(bf2d6000 - bf2d6090) [2025-09-15 18:30:06] nf_nat_masquerade_ipv4 init_addr( (null) - (null)), core_addr(bf2d4000 - bf2d4634) [2025-09-15 18:30:06] iptable_nat init_addr( (null) - (null)), core_addr(bf2d0000 - bf2d0078) [2025-09-15 18:30:06] nf_nat_ipv4 init_addr( (null) - (null)), core_addr(bf2cc000 - bf2cca6c) [2025-09-15 18:30:06] nf_nat init_addr( (null) - (null)), core_addr(bf2c6000 - bf2c7908) [2025-09-15 18:30:06] xt_recent init_addr( (null) - (null)), core_addr(bf2c1000 - bf2c20bc) [2025-09-15 18:30:06] xt_helper init_addr( (null) - (null)), core_addr(bf2bd000 - bf2bd0f8) [2025-09-15 18:30:06] xt_connmark init_addr( (null) - (null)), core_addr(bf2b9000 - bf2b9190) [2025-09-15 18:30:06] xt_connbytes init_addr( (null) - (null)), core_addr(bf2b5000 - bf2b5268) [2025-09-15 18:30:06] pptp init_addr( (null) - (null)), core_addr(bf2ae000 - bf2af23c) [2025-09-15 18:30:06] xt_conntrack init_addr( (null) - (null)), core_addr(bf2aa000 - bf2aa59c) [2025-09-15 18:30:06] xt_CT init_addr( (null) - (null)), core_addr(bf2a6000 - bf2a657c) [2025-09-15 18:30:06] iptable_raw init_addr( (null) - (null)), core_addr(bf2a2000 - bf2a208c) [2025-09-15 18:30:06] xt_state init_addr( (null) - (null)), core_addr(bf29e000 - bf29e0a0) [2025-09-15 18:30:06] nf_conntrack_ipv4 init_addr( (null) - (null)), core_addr(bf298000 - bf299504) [2025-09-15 18:30:06] nf_defrag_ipv4 init_addr( (null) - (null)), core_addr(bf294000 - bf294110) [2025-09-15 18:30:06] nf_conntrack init_addr( (null) - (null)), core_addr(bf283000 - bf28c780) [2025-09-15 18:30:06] tpbr(O) init_addr( (null) - (null)), core_addr(bf265000 - bf2781a0) [2025-09-15 18:30:06] ipt_REJECT init_addr( (null) - (null)), core_addr(bf261000 - bf2610f8) [2025-09-15 18:30:06] xt_TCPMSS init_addr( (null) - (null)), core_addr(bf25d000 - bf25d674) [2025-09-15 18:30:06] xt_comment init_addr( (null) - (null)), core_addr(bf259000 - bf259014) [2025-09-15 18:30:06] xt_multiport init_addr( (null) - (null)), core_addr(bf255000 - bf255268) [2025-09-15 18:30:06] xt_mac init_addr( (null) - (null)), core_addr(bf251000 - bf251094) [2025-09-15 18:30:06] xt_limit init_addr( (null) - (null)), core_addr(bf24d000 - bf24d1a8) [2025-09-15 18:30:06] iptable_mangle init_addr( (null) - (null)), core_addr(bf249000 - bf249130) [2025-09-15 18:30:06] iptable_filter init_addr( (null) - (null)), core_addr(bf245000 - bf24508c) [2025-09-15 18:30:06] ip_tables init_addr( (null) - (null)), core_addr(bf240000 - bf241b20) [2025-09-15 18:30:06] ip_gre init_addr( (null) - (null)), core_addr(bf23b000 - bf23c55c) [2025-09-15 18:30:06] gre init_addr( (null) - (null)), core_addr(bf237000 - bf237848) [2025-09-15 18:30:06] tipc init_addr( (null) - (null)), core_addr(bf21f000 - bf231a54) [2025-09-15 18:30:06] sit init_addr( (null) - (null)), core_addr(bf218000 - bf21aa74) [2025-09-15 18:30:06] statistics(O) init_addr( (null) - (null)), core_addr(bf1df000 - bf1e1314) [2025-09-15 18:30:06] ts_fsm init_addr( (null) - (null)), core_addr(bf1db000 - bf1db564) [2025-09-15 18:30:06] ts_bm init_addr( (null) - (null)), core_addr(bf1d7000 - bf1d7330) [2025-09-15 18:30:06] ts_kmp init_addr( (null) - (null)), core_addr(bf1d3000 - bf1d3288) [2025-09-15 18:30:06] igs(P) init_addr( (null) - (null)), core_addr(bf1cd000 - bf1cee44) [2025-09-15 18:30:06] emf(P) init_addr( (null) - (null)), core_addr(bf1c6000 - bf1c8808) [2025-09-15 18:30:06] hnd init_addr( (null) - (null)), core_addr(bf18c000 - bf1b1fa0) [2025-09-15 18:30:06] cfg80211 init_addr( (null) - (null)), core_addr(bf165000 - bf183f34) [2025-09-15 18:30:06] otp(P) init_addr( (null) - (null)), core_addr(bf161000 - bf161444) [2025-09-15 18:30:06] pwrmngtd(P) init_addr( (null) - (null)), core_addr(bf15d000 - bf15d414) [2025-09-15 18:30:06] bcmvlan(P) init_addr( (null) - (null)), core_addr(bf148000 - bf154148) [2025-09-15 18:30:06] bcm_pcie_hcd init_addr( (null) - (null)), core_addr(bf13d000 - bf141794) [2025-09-15 18:30:06] bcm_enet init_addr( (null) - (null)), core_addr(bf120000 - bf133700) [2025-09-15 18:30:06] archer(P) init_addr( (null) - (null)), core_addr(bf0f5000 - bf10ddd0) [2025-09-15 18:30:06] cmdlist(P) init_addr( (null) - (null)), core_addr(bf0e3000 - bf0ee140) [2025-09-15 18:30:06] pktflow(P) init_addr( (null) - (null)), core_addr(bf047000 - bf06cfc0) [2025-09-15 18:30:06] bcmlibs(P) init_addr( (null) - (null)), core_addr(bf040000 - bf0422d0) [2025-09-15 18:30:06] chipinfo(P) init_addr( (null) - (null)), core_addr(bf03c000 - bf03c108) [2025-09-15 18:30:06] bcm_ingqos(P) init_addr( (null) - (null)), core_addr(bf005000 - bf00833c) [2025-09-15 18:30:06] wlcsm(P) init_addr( (null) - (null)), core_addr(bf000000 - bf000ccc) [2025-09-15 18:30:06] [last unloaded: domain_dns] [2025-09-15 18:30:06] CPU: 2 PID: 0 Comm: swapper/2 Tainted: P O 4.1.52 #1 [2025-09-15 18:30:06] Hardware name: Generic DT based system [2025-09-15 18:30:06] task: cf837800 ti: cf85a000 task.ti: cf85a000 [2025-09-15 18:30:06] pc : [<c0222d10>] lr : [<c006dbc8>] psr: 60070013 [2025-09-15 18:30:06] sp : cf85bfc8 ip : 00000008 fp : 00000000 [2025-09-15 18:30:06] r10: 00000000 r9 : 0001a3d7 r8 : 49d99918 [2025-09-15 18:30:06] r7 : 0001a3d7 r6 : 49e8cc35 r5 : cfdde910 r4 : 00000001 [2025-09-15 18:30:06] r3 : 0001a3d7 r2 : 49e8cc35 r1 : 0001a3d7 r0 : cf85bfc8 [2025-09-15 18:30:06] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel [2025-09-15 18:30:06] Control: 10c5387d Table: 00f6004a DAC: 00000015 [2025-09-15 18:30:06] CPU: 2 PID: 0 Comm: swapper/2 Tainted: P O 4.1.52 #1 [2025-09-15 18:30:06] Hardware name: Generic DT based system [2025-09-15 18:30:06] Function entered at [<c0025bb0>] from [<c0021e00>] [2025-09-15 18:30:06] Function entered at [<c0021e00>] from [<c03ad07c>] [2025-09-15 18:30:06] Function entered at [<c03ad07c>] from [<c007d968>] [2025-09-15 18:30:06] Function entered at [<c007d968>] from [<c00697ac>] [2025-09-15 18:30:06] Function entered at [<c00697ac>] from [<c0069e9c>] [2025-09-15 18:30:06] Function entered at [<c0069e9c>] from [<c0068d14>] [2025-09-15 18:30:06] Function entered at [<c0068d14>] from [<c0068d48>] [2025-09-15 18:30:06] Function entered at [<c0068d48>] from [<c0073e00>] [2025-09-15 18:30:06] Function entered at [<c0073e00>] from [<c0224bf4>] [2025-09-15 18:30:06] Function entered at [<c0224bf4>] from [<c0060594>] [2025-09-15 18:30:06] Function entered at [<c0060594>] from [<c005cb18>] [2025-09-15 18:30:06] Function entered at [<c005cb18>] from [<c005cdd4>] [2025-09-15 18:30:06] Function entered at [<c005cdd4>] from [<c00193c0>] [2025-09-15 18:30:06] Function entered at [<c00193c0>] from [<c0022880>] [2025-09-15 18:30:06] Exception stack(0xcf85bf80 to 0xcf85bfc8) [2025-09-15 18:30:06] bf80: cf85bfc8 0001a3d7 49e8cc35 0001a3d7 00000001 cfdde910 49e8cc35 0001a3d7 [2025-09-15 18:30:06] bfa0: 49d99918 0001a3d7 00000000 00000000 00000008 cf85bfc8 c006dbc8 c0222d10 [2025-09-15 18:30:06] bfc0: 60070013 ffffffff [2025-09-15 18:30:06] Function entered at [<c0022880>] from [<c0222d10>] [2025-09-15 18:30:06] Function entered at [<c0222d10>] from [<c0056f10>] [2025-09-15 18:30:06] Function entered at [<c0056f10>] from [<0001948c>] [2025-09-15 18:30:06] Kernel panic - not syncing: softlockup: hung tasks [2025-09-15 18:30:06] CPU0: stopping [2025-09-15 18:30:06] CPU: 0 PID: 0 Comm: swapper/0 Tainted: P O L 4.1.52 #1 [2025-09-15 18:30:06] Hardware name: Generic DT based system [2025-09-15 18:30:06] Function entered at [<c0025bb0>] from [<c0021e00>] [2025-09-15 18:30:06] Function entered at [<c0021e00>] from [<c03ad07c>] [2025-09-15 18:30:06] Function entered at [<c03ad07c>] from [<c002444c>] [2025-09-15 18:30:06] Function entered at [<c002444c>] from [<c00193dc>] [2025-09-15 18:30:06] Function entered at [<c00193dc>] from [<c0022880>] [2025-09-15 18:30:06] Exception stack(0xc049bf48 to 0xc049bf90) [2025-09-15 18:30:06] bf40: c049bf90 0001a3d7 49f17830 0001a3d7 00000001 cfdca910 [2025-09-15 18:30:06] bf60: 49f17830 0001a3d7 49e8e4aa 0001a3d7 00000000 00000000 00000008 c049bf90 [2025-09-15 18:30:06] bf80: c006dbc8 c0222d10 60050013 ffffffff [2025-09-15 18:30:06] Function entered at [<c0022880>] from [<c0222d10>] [2025-09-15 18:30:06] Function entered at [<c0222d10>] from [<c0056f10>] [2025-09-15 18:30:06] Function entered at [<c0056f10>] from [<c046bb70>] [2025-09-15 18:30:06] CPU3: stopping [2025-09-15 18:30:06] CPU: 3 PID: 0 Comm: swapper/3 Tainted: P O L 4.1.52 #1 [2025-09-15 18:30:06] Hardware name: Generic DT based system [2025-09-15 18:30:06] Function entered at [<c0025bb0>] from [<c0021e00>] [2025-09-15 18:30:06] Function entered at [<c0021e00>] from [<c03ad07c>] [2025-09-15 18:30:06] Function entered at [<c03ad07c>] from [<c002444c>] [2025-09-15 18:30:06] Function entered at [<c002444c>] from [<c00193dc>] [2025-09-15 18:30:06] Function entered at [<c00193dc>] from [<c0022880>] [2025-09-15 18:30:06] Exception stack(0xcf86dfa8 to 0xcf86dff0) [2025-09-15 18:30:06] dfa0: cfde8910 00000001 052bf190 c06676f4 cf86c000 cfde8910 [2025-09-15 18:30:06] dfc0: cfde9200 cf86dff0 c0497200 00000000 c04bcee4 00000000 00000000 cf86dff0 [2025-09-15 18:30:06] dfe0: c0056f30 c0222e18 00000113 ffffffff [2025-09-15 18:30:06] Function entered at [<c0022880>] from [<c0222e18>] [2025-09-15 18:30:06] Function entered at [<c0222e18>] from [<c0056f30>] [2025-09-15 18:30:06] Function entered at [<c0056f30>] from [<0001948c>] [2025-09-15 18:30:06] SMP: failed to stop secondary CPUs [2025-09-15 18:30:06] ----
09-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值