当前位置: 首页 > news >正文

16.shell编程-函数

学习 Shell 函数(function) 是从“写脚本”迈向“写程序”的关键一步,掌握函数后,你就能让脚本模块化、可复用、可维护,就像在 C / Python 里写函数一样。

下面我们系统地讲一遍:

📘 定义语法 → 参数传递 → 返回值 → 作用域 → 高级用法 → 实战示例。


🧩 一、什么是 Shell 函数?

函数(Function)就是一段可复用的脚本代码,用来完成特定任务。
写一次,可以多次调用。
它让脚本结构更清晰,更容易维护。


⚙️ 二、函数定义语法

在 Shell(如 bash)中,有两种等价写法:

# 写法1(推荐)
function 函数名 {命令序列
}# 写法2(更通用)
函数名() {命令序列
}

👉 注意:

  • function 关键字可省略。
  • {} 内的命令与普通 Shell 命令一样执行。
  • 定义函数时不能在同一行加 () 参数(不像 Python/C)。

🧠 三、简单示例

#!/bin/bashsay_hello() {echo "Hello, Shell!"
}say_hello
say_hello

输出:

Hello, Shell!
Hello, Shell!

✅ 执行时,Shell 会先加载整个脚本的函数定义,然后再按调用顺序执行。


🧮 四、函数参数传递

函数的参数使用 $1$2、…、$9 表示,
与脚本自身的参数机制一致。

示例:

#!/bin/bashgreet() {echo "Hello, $1!"echo "Today is $2."
}greet "Alice" "Friday"

输出:

Hello, Alice!
Today is Friday.

常用参数变量

变量含义
$0脚本名(不是函数名)
$1$9函数的前9个参数
$#参数个数
$@所有参数(分开显示)
$*所有参数(整体显示)
"$@"保留参数间空格的安全写法

示例:遍历所有参数

print_args() {echo "参数个数: $#"for arg in "$@"; doecho "参数: $arg"done
}print_args apple banana "hello world"

输出:

参数个数: 3
参数: apple
参数: banana
参数: hello world

🔁 五、返回值机制

函数执行后,可用 $? 查看返回状态码(0 表示成功,非0表示错误)。

is_root() {if [ "$EUID" -eq 0 ]; thenreturn 0elsereturn 1fi
}is_root
if [ $? -eq 0 ]; thenecho "你是 root 用户"
elseecho "你不是 root 用户"
fi

自定义返回值

return 语句可以返回 0–255 的整数:

sum() {return $(($1 + $2))
}sum 3 5
echo "返回值: $?"   # 输出 8

⚠️ 限制:
return 只能返回整数(0–255),
如果要返回字符串或更复杂结果 → 用 echo + 命令替换


返回字符串(推荐做法)

get_name() {echo "Alice"
}name=$(get_name)
echo "Hello, $name!"

🧱 六、作用域(变量可见性)

默认情况下,Shell 变量是全局的
要让变量只在函数内有效,需使用 local

#!/bin/bash
foo="global"test_func() {local foo="local"echo "函数内: $foo"
}test_func
echo "函数外: $foo"

输出:

函数内: local
函数外: global

⚡ 七、嵌套函数与函数调用顺序

函数可以在函数里调用其他函数:

add() {echo $(($1 + $2))
}sum_and_double() {local sum=$(add $1 $2)echo $(($sum * 2))
}sum_and_double 3 4  # 输出 14

🧰 八、带条件的函数调用

log_info() {echo "[INFO] $1"
}log_error() {echo "[ERROR] $1"
}if [ "$1" == "error" ]; thenlog_error "Something went wrong!"
elselog_info "All good."
fi

🧩 九、函数库(模块化脚本)

你可以把函数写到单独文件中,然后用 source. 引入。

例如:

文件:utils.sh

say_hi() {echo "Hi, $1"
}

主脚本:

#!/bin/bash
source utils.sh
say_hi "Bob"

输出:

Hi, Bob

🧮 十、实战例子:系统健康检测函数

#! /bin/bashcheck_cpu() {usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')echo "CPU使用率: $usage%"
}check_mem() {free -h | awk '/Mem/ {print "内存使用: "$3 "/" $2}'
}check_disk() {df -h | awk '$NF=="/"{print "磁盘使用: "$5}'
}system_report() {echo "=== 系统状态报告 ==="check_cpucheck_memcheck_disk
}system_report

输出示例:

=== 系统状态报告 ===
CPU使用率: 15.3%
内存使用: 2.5G/8G
磁盘使用: 67%

🧠 十一、总结速查表

功能示例说明
定义函数f() { echo hi; }两种写法都行
调用函数f直接写名字
传递参数$1, $2, …与脚本参数机制相同
参数个数$#统计参数数量
所有参数"$@"保留空格最安全
返回值return N / echo数值用 return,字符串用 echo
局部变量local var=value仅函数内部有效
引用库函数source file.sh导入函数文件

🧩 十二、进阶:匿名函数(间接调用)

虽然 Shell 不支持“真正匿名函数”,
但可以通过变量名间接调用函数:

say_hi() { echo "Hi, $1"; }func_name="say_hi"
$func_name "Bob"

输出:

Hi, Bob

http://www.dtcms.com/a/479089.html

相关文章:

  • 怎样让自己网站的文章被百度收录自己在家做网站
  • 青岛行业网站建设电话佛山网站建设方案服务
  • 书店网站建设设计方案小程序可以做企业网站
  • C++面试(1)
  • 2025年主流运动耳机测评,园世Beta pro怎么样?
  • icp备案网站信息wordpress add_action 是什么意思
  • 7-数组的概念和使用
  • 基数排序算法实现
  • 10.9 DevEco Studio安装
  • 健康风险评估实训室:功能与实训场景介绍
  • 哈尔滨专业网站营销通化县住房和城乡建设局网站
  • vue2使用wangEditor:上传图片,视频,设置表格,自定义初始化字体和大小
  • 调试BMI088(X5平台)
  • 微信群领券网站怎么做wordpress七牛同步上传
  • EtherNet/IP转ModbusTCP协议转换器实现水质数据零延迟交互
  • 拌合站软件开发(27)监测各项IP设备可访问性
  • 网站设计论文答辩问题及答案万能回答企业管理培训课程推荐
  • Cannot Run Git: error launching git:
  • 模板建站源码wordpress调用二级分类目录
  • 车载刷写框架 --- 刷写过程中擦除相关思考
  • 初中做语文题的网站怎么开网站 第一步怎么做
  • 漯河网站推广哪家好微信小程序模板使用
  • 【大模型实战笔记 3】大模型Function Call的原理及应用
  • 校园网站的作用广州网络推广外包平台
  • 微网站 获取手机号凡客诚品网站建设策划书
  • MyCat 实战:订单与用户数据的水平分库分表 + MySQL 读写分离完整方案
  • Learning Path Recommendation
  • 【足式机器人控制】名义落足点与Raibert落足点详细讲解
  • 简单聊聊数据可视化大屏制作的前端设计与后端开发
  • 做网站首选科远网络中文域名网站链接无法打开