shell函数

介绍及使用

Shell脚本模块化核心总结

问题根源:脚本从上到下顺序执行,代码量一大(300-500行),调试、改序、排错都变成复制粘贴的体力活,甚至比重写还慢。

解决方案:代码模块化 —— 按功能拆分,按需调用。

具体做法:

  • 用函数封装重复逻辑

  • 拆成独立 .sh 文件,用 source 加载

  • 主脚本只保留流程调度,具体实现放模块里

核心收益:

  • 改顺序 → 调换函数调用顺序即可

  • 排错 → 锁定模块范围,不受其他代码干扰

  • 复用 → 写好的模块可被多个脚本共用

一句话心法:主脚本读起来像目录,全是函数名,没有实现细节。

📌 Shell 函数

定义:将一组命令或语句封装成带名字的代码块,后续可通过函数名直接调用。

本质:给完成特定功能的一段代码命名、封装。

优点:

优势

说明

调用方便

一次定义,多次调用,节省内存

代码量少

模块化后主脚本精简,排错更简单

灵活调度

调整调用顺序即可改变执行流程,无需复制粘贴

一句话总结:函数就是把重复做的事打包起个名,用的时候喊一声就行。

函数定义

 语法一:
 ​
 函数名() {
     代码块
     return N
 }
 ​
 ​
 语法二:
 function 函数名() {
       代码块
       return N
 }
 ​
 函数中return说明:
 1.return可以结束一个函数,类似于前面讲的循环控制语句break(结束当前循环,执行循环体后面的代码)
 2.return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0-256之间。
 3.如果没有return命令,函数将返回最后一个Shell的退出值。

函数调用

当前命令行调用

 # 函数调用案例(测试内容)
 #!/bin/bash
 hello(){
 echo "hello chenxiansen $1"
 hostname
 }
 menu(){
 cat << EOF
 1. mysql
 2. web
 3. app
 4. exit
 EOF
 }
 ​
 # 执行的两种方式(在当前 Shell 环境中加载才能在后续调用这些函数)
 source ceshi.sh 
 . ceshi.sh 
 ​
 # 执行函数结果显示
 [root@localhost shell]# hello 777
 hello chenxiansen 777
 localhost.localdomain
 ​
 # 执行函数结果显示
 [root@localhost shell]# menu
 1. mysql
 2. web
 3. app
 4. exit

定义到用户的环境变量中

 # 体系流程图
 ┌─────────────────────────────────────────────────────────┐
 │               Linux 配置文件体系                          │
 ├─────────────────────────────────────────────────────────┤
 │                                                         │
 │  /etc/profile        ← 系统级(所有用户,登录时执行)         │
 │         │                                               │
 │         ├──→ /etc/bashrc    ← 系统级(所有用户,每次开终端) │
 │         │                                               │
 │         └──→ ~/.bash_profile ← 用户级(当前用户,登录时)    │
 │                   │                                     │
 │                   └──→ ~/.bashrc ← 用户级(当前用户,每次开终端)│
 │                                                         │
 └─────────────────────────────────────────────────────────┘
 ​
 # 查看配置文件
 [root@localhost shell]# cat ~/.bashrc
 # .bashrc
 ​
 # User specific aliases and functions
 ​
 alias rm='rm -i'
 alias cp='cp -i'
 alias mv='mv -i'
 ​
 # Source global definitions
 if [ -f /etc/bashrc ]; then
         . /etc/bashrc
 fi
 ​
 hello(){
 echo "hello chenxiansen $1"
 hostname
 }
 menu(){
 cat << EOF
 1. mysql
 2. web
 3. app
 4. exit
 EOF
 }
 ​
 注意:
 当用户打开bash的时候会读取该文件

脚本中调用

 #!/bin/bash
 #打印菜单
 source ./ceshi.sh 
 menu(){
 cat << END
     h   显示命令帮助
     f   显示磁盘分区
     d   显示磁盘挂载
     m   查看内存使用
     u   查看系统负载
     q   退出程序
 END
 }
 ​
 menu        //调用函数
 ​
 # 脚本流程图
 ┌─────────────────────────────────────────────┐
 │  ./这个脚本.sh                                 │
 │                                              │
 │  1. 加载 ceshi.sh                            │
 │     └─ 把 hello、menu(旧版)加载进来            │
 │                                              │
 │  2. 定义 menu(新版)                            │
 │     └─ 覆盖了旧版 menu                          │
 │                                              │
 │  3. 调用 menu                                │
 │     └─ 显示新版菜单                             │
 │                                              │
 │  结果:显示系统运维菜单                           │
 └─────────────────────────────────────────────┘