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










