Shell面试题更新 2026-08-03

在 Shell 脚本编程里,位置参数(positional parameter)是如何定义的?请说明它们代表什么信息,并通过具体示例阐述如何获取、引用和操作这些参数。

考察说明

考查对 Shell 脚本中位置参数概念、引用方式及常用命令的掌握程度。

回答思路

  1. 【回答框架 1】位置参数是脚本或函数调用时附带的命令行参数,在脚本内部通过 $1、$2 等变量依次访问,$0 代表脚本名本身。它们为脚本提供外部输入,使脚本能根据参数动态执行任务。
  2. 【回答框架 2】引用位置参数时,$1 到 $9 直接使用数字,超过 9 个需用 ${10} 包裹,避免歧义。$# 提供参数个数,$@ 和 $* 都表示所有参数,但 $@ 在双引号内保持每个参数独立,而 $* 将所有参数视为单个字符串。
  3. 【回答框架 3】常用操作包括 shift 命令左移参数,使 $2 变为 $1,适合循环处理参数列表;$? 可获取上一个命令退出状态,但并非位置参数专属。set -- 可重置位置参数,用于重组参数序列。
  4. 【回答框架 4】实际使用中,通过 if [ $# -eq 0 ] 可检测是否无参数传入,配合循环与 case 语句可实现参数解析,如根据参数选择执行分支。
  5. 【回答框架 5】注意区分位置参数与特殊参数:$0 是脚本名,$# 是数量,$$ 是进程 ID,这些各有用途,不应混淆。
  6. 【关键点 1】位置参数由 $1 开始,$0 为脚本名,引用时超过 9 个需写 ${10} 形式。
  7. 【关键点 2】$# 统计参数个数,$@ 保持参数独立性,$* 将所有参数合并为单个字符串。
  8. 【关键点 3】shift 命令左移参数,常用于遍历参数列表;set -- 可重置位置参数。
  9. 【关键点 4】用条件判断和循环可灵活处理参数存在性与使用方式。
  10. 【易错点 1】混淆 $* 与 $@ 在双引号中的差异,导致参数传递时丢失边界。
  11. 【易错点 2】忘记用 ${10} 形式引用第 10 个及以上参数,出现语法错误或错误值。
  12. 【易错点 3】未检查参数个数就使用 $1,脚本在无参数时可能因空值产生非预期行为。