shift命令是参数队列的“手动推进器”,通过左移参数位置(如shift 2跳过选项及值)、访问$10+参数(shift 9后原$10变$1)和配合while循环遍历所有参数,实现对混合型命令行参数的手动解析与处理。

shift 命令的核心作用
shift 不是解析选项的“智能工具”,而是参数队列的“手动推进器”:它把 $1 $2 $3… 整体向左平移,让原本的 $2 变成新的 $1,$3 变成 $2,依此类推。它不识别 -a 或 --verbose,也不自动跳过选项值;它只做一件事——丢弃左边若干个参数,腾出位置让后续参数“顶上来”。这对处理混合型、无固定结构的命令行非常实用。
处理带值选项(如 -f filename)
当遇到需要参数值的短选项(例如 -f file.txt),必须在 shift 之前先读取并保存 ,再用 shift 2 一次性跳过选项和它的值:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 检查
$1是否为-f,若是,则file=$2 - 紧接着执行
shift 2,这样$3就变成新的$1 - 若未配对(比如
-f后面没参数),应提前报错并退出,避免$2为空导致逻辑错误
跳过前 N 个固定参数,访问第 10 个以后的参数
Shell 默认只提供 $1 到 $9 的直接引用。想访问第 10 个参数?只需先用 shift 9,之后原 $10 就变成 $1,可直接使用:
-
shift 9后,原$10 $11 $12分别变为$1 $2 $3 - 常用于启动脚本中:前几个参数是配置开关(如
-d -v),后面全是待处理文件列表 - 注意:执行前需确保
$# >= 9,否则shift 9失败并返回非零值
配合 while 循环逐个消耗所有参数
这是最典型的用法——用 while [ $# -gt 0 ] 搭配 shift 实现“边读边删”的遍历:
- 循环体内先判断
$1类型(是否以-开头) - 匹配到选项就提取或设标志,匹配到非选项(如文件名、数值)就加入处理队列
- 每次处理完一个参数,执行一次
shift(或shift n) - 循环自然结束于
$# == 0,无需手动计数










