Shell 脚本传参需正确使用位置参数($1、$2 等)、特殊参数($@、$#)、引号保护、默认值语法 ${:-}及 getopts 解析选项,以确保参数准确获取、空格 / 元字符安全处理、必要参数校验和短选项支持。

如果您在编写 Linux Shell 脚本时需要接收外部输入,但发现参数未被正确识别或变量值为空,则可能是由于位置参数使用不当或特殊参数未被恰当引用。以下是实现 Shell 脚本传参与变量控制的具体操作步骤:
一、使用位置参数获取命令行输入
Shell 脚本启动时,系统会将命令行中紧跟脚本名之后的每个词依次赋给位置参数 $1、$2、$3 等,这些参数可直接用于脚本逻辑处理。
1、创建脚本文件 test.sh,内容为:echo “ 第一个参数是:$1”
2、赋予执行权限:chmod +x test.sh
3、运行脚本并传入参数:./test.sh hello world
4、输出结果中仅显示 第一个参数是:hello,$2 值为 world 但未被打印
二、引用全部参数与参数个数
当需遍历所有输入或判断是否提供足够参数时,应使用 $@、$* 和 $# 等特殊参数,它们分别表示参数列表、合并后的参数字符串和参数总数。
1、在脚本中添加:echo “ 共收到 $# 个参数 ”
2、添加循环语句:for arg in “$@”; do echo “ 参数:$arg”; done
3、保存后执行:./test.sh apple banana cherry
4、输出包含参数总数 3,并逐行列出apple、banana、cherry 三个值
三、处理含空格或特殊字符的参数
若用户输入的参数本身包含空格、星号或问号等 shell 元字符,必须用双引号包裹 ”$@” 以保持原始分隔结构,避免单词拆分与路径扩展。
1、编写测试脚本:echo “ 原始参数:$@”
2、执行命令:./test.sh “file name.txt” “*test?”
3、确认输出中 file name.txt 作为一个整体出现,而非拆分为 file 和 name.txt
4、验证 *test? 未被当前目录文件匹配,仍原样输出
四、设置默认值与参数校验
通过 ${VAR:-default}语法可为未设置或为空的变量提供默认值;结合 if 语句可对必需参数进行存在性检查,防止脚本异常中断。
1、在脚本开头添加:filename=${1:-“default.txt”}
2、添加校验逻辑:if [-z “$2”]; then echo “ 错误:缺少第二个参数 ”; exit 1; fi
3、调用时仅传一个参数:./test.sh data.log
4、脚本将把 filename 设为 data.log,同时因 $2 为空而输出错误信息并退出
五、使用 getopts 解析短选项参数
当脚本需支持类似 ls -l - a 或 cp -r src dst 的选项风格时,getopts 内置命令可逐个提取带连字符的单字符选项及其参数,自动处理选项组合与缺失值报错。
1、在脚本中定义选项处理块:while getopts “r:f:” opt; do case $opt in r) recursive=1;; f) file=”$OPTARG”;; ?) echo “ 无效选项:-$OPTARG”; exit 1;; esac; done
2、确保选项字符串中冒号紧跟选项字母后表示该选项需参数,如 f: 表示 - f 必须后跟值
3、执行:./test.sh -r -f config.ini
4、脚本内 recursive 变量被设为 1,file 变量被设为 config.ini