Linux中case处理命令行参数的核心是用$1匹配预设模式,比if-elif更简洁;支持固定字符串、大小写不敏感(如sS[lL])、通配符(*.log)及shift处理多参数。

Linux 中用 case 处理命令行参数,核心是把 $1(第一个参数)作为匹配变量,按预设模式分支执行对应操作。它比一长串 if-elif 更简洁、可读性更强,特别适合服务启停、备份类型选择这类固定选项场景。
基础写法:匹配固定字符串
最常见的是处理几个明确的子命令,比如 start、stop、status:
- 脚本开头用
case $1 in开始匹配 - 每个分支以
模式)开头,后面跟命令,以;;结尾 - 用
|可合并多个等效模式,比如-h|-help) - 必须包含
*)分支作兜底提示,否则输错参数会静默失败
示例:
#!/bin/bash
case $1 in
start)
echo "启动服务"
systemctl start myapp
;;
stop)
echo "停止服务"
systemctl stop myapp
;;
status)
systemctl status myapp
;;
-h|--help)
echo "用法: $0 {start|stop|status}"
exit 0
;;
*)
echo "错误: 未知参数 '$1'" >&2
echo "用法: $0 {start|stop|status}" >&2
exit 1
;;
esac
支持大小写不敏感匹配
默认 case 区分大小写,SQL 和 sql 不会匹配同一分支。有三种常用解法:
-
在模式中显式列出大小写组合:如
[sS][qQ][lL])或s[qQ][lL]|S[QQ][LL]) -
启用
nocasematch选项:在case前加shopt -s nocasematch,匹配后可选shopt -u nocasematch关闭 -
统一转小写再匹配:用
cmd=$(echo "$1" | tr 'A-Z' 'a-z'),再对$cmd做case
推荐第一种——直接在模式里写 [sS][qQ][lL]),无需额外开关,逻辑清晰且兼容性好。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
用通配符匹配一类参数
当需要按格式而非精确值判断时,通配符非常实用:
-
*.log)匹配所有以.log结尾的参数(如access.log) -
-f*)匹配以-f开头的任意长参数(如-fconfig.conf) -
[0-9])匹配单个数字;[a-z])匹配单个小写字母 -
???)匹配恰好三个字符的参数
注意:* 单独出现(即 *))代表“其他所有情况”,必须放在最后,否则会提前截断匹配。
处理多个参数时配合 shift
如果脚本要接收多个位置参数(如 ./deploy.sh prod us-west nginx),单靠 $1 不够用。这时可在 case 内部用 shift 向左移动参数列表:
-
shift默认移除$1,原$2变成新$1,$#减 1 - 循环使用
while [ $# -gt 0 ]; do case $1 in ...; shift; done可逐个解析 - 避免在
case分支里混用$2、$3—— 它们可能因shift而失效
简单示例(只处理前两个参数):
case $1 in
install)
if [ $# -lt 2 ]; then
echo "缺少包名"; exit 1
fi
echo "安装 $2"
shift 2 # 移走 $1 和 $2,剩下参数从 $1 开始
# 继续处理剩余参数...
;;
*)
echo "仅支持 install"
;;
esac










