$0 身份单独保留;shift 移除第一个空位置参数,让 two words 从 $2 移到 $1。

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

Shell 脚本接收的是有顺序的参数列表,不是需要重新按空格拆分的一整条命令字符串。位置参数通过 $1、$2 等编号暴露这份列表,$# 表示数量。固定且简单的接口可以直接使用位置,带可选设置或开关的接口则适合明确解析。无论采用哪种形式,都需要规定允许几个参数、是否允许空值,以及输入错误时怎样失败。 先保留参数列表,再解释含义。语法解析与业务验证是两道独立检查;重复调用需要新的局部解析状态。此图表示原文实验预期,本轮未重新执行。 解释含义之前,先保住列表边界 $0 表示脚本名称等特殊身份,不属于位置参数,也不计入 $#。使用 bash -c 时,命令字符串之后的第一个参数会成为 $0,包装脚本若误以为它是 $1,就会看起来少收到一个参数。超过第九个位置必须使用花括号:${10} 是第十个参数,$10 却是第一个参数再接一个字面数字零,两种写法不能互换。 "$@" 会为每个传入参数保留一个词,包括空字符串和包含空格的值。未引用的展开可能再次分词并展开通配符,"$*" 则会把列表连成一个字符串。转发或遍历时应使用带引号的完整列表。set -- 替换当前的位置参数,shift 删除前面的若干项;这些操作在对应脚本或函数作用域中生效,不会反向改写外部调用者原来的参数列表。 空参数仍然占据一个位置。检查 $# 可以区分完全没有提供参数,与明确传入 '' 两种情况。${1:?message} 同时拒绝缺失和空值,只有接口要求非空时才合适。应先验证数量,再读取必需的位置,最后判断内容是否合法,避免在参数本来不存在时就触发与接口说明无关的展开错误。 ...

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