shell函数声明和多参数传递的关键是用() { }语法定义函数、靠$1 $2等位置变量接收参数、用"$@"安全遍历;不写括号参数、不声明形参、不依赖function关键字,且需前置定义或正确source加载。

Shell函数声明和多参数传递的关键,是用标准语法定义函数、靠位置变量接收参数、用$@安全遍历——不写括号、不声明形参、不依赖function关键字。
声明函数:用() { }语法,别加function
标准写法是func_name() { commands; }。这种形式兼容 POSIX,在 bash、dash、sh 等环境都能运行。带function前缀(如function backup() { })在 dash 中会报错,不推荐。
- 函数名后括号必须为空:
process_files()✔️;process_files($1, $2)或process_files /tmp❌(Shell 会当作命令查找) - 定义要放在调用之前,或确保
source加载顺序正确;避免塞在if块里却未执行到
传多个参数:空格分隔,用$1、$2…和$@取值
调用时直接写func_name arg1 arg2 arg3,中间用空格分隔。函数体内通过、等获取对应值,$#得总数,$@用于安全遍历。
-
$@在双引号中保持各参数独立,适合含空格的路径:for f in "$@"; do cp "$f" /dest/; done -
$*会把所有参数拼成一个字符串,"$*"等价于"arg1 arg2 arg3",不适合循环处理文件名 - 超过 9 个参数时,用
${10}、${11}写法,不能省略大括号
复用数据处理逻辑:封装+校验+局部变量
把共用操作(比如日志记录、路径校验、批量压缩)抽成函数,调用时传入不同参数即可复用,不用复制粘贴代码。
- 开头加参数检查:
if [ $# -lt 2 ]; then echo "用法: $0 "; exit 1; fi - 用
local声明临时变量,防止污染全局:local tmp_dir=$(mktemp -d) - 需要返回字符串?不用
return,改用echo输出,调用方用result=$(myfunc a b)捕获
一个可复用的文件处理函数示例
比如批量重命名日志文件:
rename_logs() {
if [ $# -lt 2 ]; then
echo "用法: $0 "
return 1
fi
local dir="$1"
local prefix="$2"
shift 2
for file in "$@"; do
[ -f "$dir/$file" ] && mv "$dir/$file" "$dir/${prefix}_${file}"
done
}
# 调用方式:
rename_logs /var/log "bak_20260720" auth.log kern.log











