Shell函数基础
函数
定义
- 把一段代码块放进放进函数里面进行封装,可以实现一次书写,终身调用
创建函数
- 格式
function name {
commands
}
或者
name() {
commands
}
-
注意事项
- 函数名必须唯一,一个脚本两个同名函数,新函数覆盖旧函数
调用函数
-
函数定义后,直接通过函数名调用(不需要加括号)
-
注意事项
- 函数必须先定义,采用被调用
函数返回码
-
使用标准变量
-
$?
-
注意事项
- 默认只返回最后一条命令执行的状态码
- 如果最后一条命令执行成功,返回0状态码,即使函数中间有命令执行失败
-
-
使用return命令
-
return num
-
注意事项
- 为了避免提取函数返回值前执行了其他命令导致函数返回值的丢失(覆盖),建议函数结束马上取返回值
- 退出状态码必须为0-255共256个
-
处理函数输出
variable=$(function )
向函数传参
-
function value
-
脚本命令行传参给函数
-
函数不能直接使用命令行传给的参数。可以通过给脚本传参,脚本使用特殊参数变量保存参数值,使用函数时,把特殊参数变量作为函数的参数传给函数
-
注意事项
-
特殊参数变量说明
-
$@
- 代表存储所有参数的值
-
$#
- 代表参数的个数
-
-
-
-
函数处理变量
-
全局变量
-
默认在脚本中定义的变量都是全局变量,全局变量在脚本的任何地方都有效,包括函数内部
-
注意事项
- 全局变量在脚本文件中定义和赋值,函数调用该值时改变该值,当脚本主体再次调用该全局变量时,将会是被函数修改后的变量值
-
-
局部变量
-
局部变量在函数内部定义,只在函数内部使用
-
语法格式
local varibale
-
注意事项
- 局部变量使得函数变量和脚本变量相隔离,同时脚本变量可以共享给函数使用
-
函数处理数组
-
先分后合
-
函数只会读取数组变量的第一个值,而不是数组变量的全部值。如果要函数把数组所有的值都读取出来,需要先把数组变量传给函数,函数把原数组拆分成每一个值,再把每一个值赋给新数组
-
函数重组数组
-
定义局部变量
local arrayname
-
拆分数组并赋值给新数组
arrayname=($(echo "$@"))
-
-
函数返回处理后的数组
echo ${arrrayname[*]}
-
函数递归
-
函数调用自身获得结果
-
典型应用
-
计算阶乘
-
阶乘
-
一个数的阶乘等于该数之前的所有数乘以该数的值
-
公式
x!=x*(x-1)!
-
函数实现
-
思路
-
想要求x的阶乘,先求出x-1的阶乘,想要x-1的阶乘,先求出x-2的阶乘....
-
具体实现
- 获取用户输入值,如果等于1,则返回1;大于1则开启函数递归功能(递归的过程是求取x-1及之前的总数值),最终把递归求出得值乘以用户输入值
fuction factorial { if [$1=1] then echo 1 else local temp=[$1 - 1] local result="factorial $temp" echo $[$result * $1 ] fi }
-
-
-
-
-
函数库的使用
-
库文件
- 把多个函数写进一个文件,在脚本文件中进行导入调用
-
导入函数库
source filename
或者
. filename
-
注意事项
- filename为库文件名,如果与脚本文件不在同一个目录,需要加上绝对路径
-
-
在.bashrc中定义函数
- 在.bashrc文件中导入文件库或定义函数,可以实现所有的shell初始化启动时可以自动加载,可以在命令行和脚本文件中直接使用函数,而不用再次导入
- , path/filename
命令行创建函数
-
单行创建函数
-
function name { xxx ; }
-
注意事项
- 单行创建函数必须加分号,代表函数结束
-
-
多行创建函数(使用次提示符)
function name { xxx }
-
注意事项
- { 代表函数起始,}代表结束
-
-
注意事项
- 命令行定义的函数的函数名不可以和内建的命令重复,否则会覆盖函数系统的命令
shtool库
-
提供大量的shell脚本函数
-
基本语法
shtool [option ] [function [options] [args] ]
-
常用函数
shtool paltform
- 查看发行版和CPU硬件信息
shtool proc -p "text"
- 创建执行命令的旋转进度条和提示文本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!