脚本从命令行收到的、按编号排列的参数。

Shell 位置参数是一份有编号的清单

Shell 脚本接收的是有顺序的参数列表,不是需要重新按空格拆分的一整条命令字符串。位置参数通过 $1、$2 等编号暴露这份列表,$# 表示数量。固定且简单的接口可以直接使用位置,带可选设置或开关的接口则适合明确解析。无论采用哪种形式,都需要规定允许几个参数、是否允许空值,以及输入错误时怎样失败。 解释含义之前,先保住列表边界 $0 表示脚本名称等特殊身份,不属于位置参数,也不计入 $#。使用 bash -c 时,命令字符串之后的第一个参数会成为 $0,包装脚本若误以为它是 $1,就会看起来少收到一个参数。超过第九个位置必须使用花括号:${10} 是第十个参数,$10 却是第一个参数再接一个字面数字零,两种写法不能互换。 "$@" 会为每个传入参数保留一个词,包括空字符串和包含空格的值。未引用的展开可能再次分词并展开通配符,"$*" 则会把列表连成一个字符串。转发或遍历时应使用带引号的完整列表。set -- 替换当前的位置参数,shift 删除前面的若干项;这些操作在对应脚本或函数作用域中生效,不会反向改写外部调用者原来的参数列表。 空参数仍然占据一个位置。检查 $# 可以区分完全没有提供参数,与明确传入 '' 两种情况。${1:?message} 同时拒绝缺失和空值,只有接口要求非空时才合适。应先验证数量,再读取必需的位置,最后判断内容是否合法,避免在参数本来不存在时就触发与接口说明无关的展开错误。 getopts 检查语法,业务规则检查含义 可移植的 getopts 处理短选项。选项字符后面的冒号表示该选项需要一个值,但不会自动提供 --user 这类长选项支持。选项说明开头的冒号表示采用安静错误报告:未知选项产生问号,缺少值产生冒号,相关选项字符放在 OPTARG 中。脚本必须明确处理这些分支,不能因为解析循环继续运行就误以为输入合法。 OPTIND 记录解析进度。在同一 Shell 中开始解析另一份参数之前,应把它重置为一;解析完成后,使用 shift "$((OPTIND - 1))" 让剩余操作数成为当前列表。-- 结束选项处理,因此以连字符开头的文件名也能被当作操作数。普通的非选项同样会结束扫描,不能假定写在文件名后面的选项会被自动搬到前面。 ...

十一月 29, 2027 · 2 分钟 · XB Field Notes