macos shell脚本接收参数主要有命令行传参(位置参数)和运行时交互输入(read命令)两种方式:前者通过$0、$1、$#、$*、$@等特殊变量获取;后者用read -p、-s、-t、-n等选项实现提示、隐藏、超时、定长输入;常组合使用,优先命令行参数,缺失时交互补全,并注意赋值无空格、引用用${var}、合理使用unset/readonly。
在 macos 的 shell 脚本中,接收和处理用户输入参数主要有两种方式:命令行传参(位置参数)和运行时交互输入。两者适用场景不同,用法也各有侧重。
用位置参数接收命令行输入
当你执行 ./script.sh arg1 arg2 时,Shell 自动把参数按顺序存入特殊变量:
-
$0是脚本自身路径(如./script.sh) -
$1、$2… 对应第一个、第二个参数(最多支持${10}这种带花括号的写法) -
$#返回参数总个数,适合做数量校验 -
$*把所有参数拼成一个字符串(含空格),$@则保持各参数独立,遍历时更安全
示例:检查是否至少传入一个参数
#!/bin/bash if [ $# -eq 0 ]; then echo "请至少提供一个参数" exit 1 fi echo "你输入的第一个参数是:$1"
用 read 命令获取运行时交互输入
适合需要用户临时输入、密码、确认信息等场景,支持多种选项:
-
read -p "提示文字: " varname:带提示符读取一行,存入变量 -
read -s -p "密码: " pwd:不回显输入内容(常用于密码) -
read -t 5 -p "5秒内输入: " input:设置超时(单位秒) -
read -n 3 char:只读取前3个字符,输完立即继续
注意:read 后需换行或加 echo 避免光标错位;密码类敏感内容不要 echo 明文打印。
组合使用提升实用性
实际脚本中常把两者结合:先尝试读取命令行参数,缺失时再交互补全。
- 比如
./deploy.sh staging直接部署到 staging 环境 - 若没传参,则提示
read -p "请输入目标环境 (prod/staging): " env - 再用
case $env in ...分支处理不同逻辑
避免常见错误
变量赋值时等号两边不能有空格:name=alice ✅,name = alice ❌(会报“command not found”)
引用变量建议统一用 ${var} 形式,尤其在拼接字符串时防歧义:"Hello ${name}!" 比 "Hello $name!" 更稳妥
用 unset var 清除变量,用 readonly var=value 锁定常量,防止意外覆盖











