Shell面试题更新 2026-08-05

请说明在 Bash 脚本编程中,数组的常用操作是如何实现的?

编码实现技术原理Shell

考察说明

考查对 Bash 数组基础语法、常见操作及作用域的理解与应用能力。

回答思路

  1. 【回答框架 1】Bash 数组分为索引数组和关联数组两种。索引数组下标从 0 开始,可用括号直接定义:arr=(a b c) 或 arr[0]=a;关联数组需先用 declare -A arr 声明,再用字符串键取值,例如 arr[name]=value。
  2. 【回答框架 2】数组基本操作包括取元素、取所有元素、获取长度和添加删除元素。取单个元素用 ${arr[下标]},取所有元素用 "${arr[@]}" 或 "${arr[*]}",区别在于前者保持每个元素独立,后者后续拼接;获取长度用 ${#arr[@]} 或 ${#arr[*]};追加元素可用 arr+=(新元素) 或直接 arr[下标]=值;删除元素或整个数组用 unset arr[下标] 或 unset arr。
  3. 【回答框架 3】遍历数组常用 for 循环,优先使用 "${arr[@]}" 加双引号的形式,以避免元素内含空格或通配符时被错误拆分;若需获取下标,可用 for i in "${!arr[@]}",其中 ${!arr[@]} 列出所有下标。
  4. 【回答框架 4】还需注意数组在函数和子 Shell 中的作用域:普通数组是全局的,函数内修改会影响外部,除非声明为 local;管道或命令替换中产生的数组是子 Shell 的,外部无法看到,因此需要谨慎处理,必要时使用进程替换或临时文件。
  5. 【回答框架 5】实际编程中要防止未声明关联数组直接使用、索引越界、空数组与未定义变量的区分,以及使用 ${arr} 而非 ${arr[0]} 导致的歧义;这些点都可能导致脚本行为不符合预期。
  6. 【关键点 1】索引数组直接用括号定义,关联数组需先 declare -A 声明。
  7. 【关键点 2】"${arr[@]}" 保留元素独立,"${arr[*]}" 会按 IFS 拼接。
  8. 【关键点 3】数组长度用 ${#arr[@]},所有下标用 ${!arr[@]}。
  9. 【关键点 4】遍历数组必须对 "${arr[@]}" 加双引号防止单词拆分。
  10. 【关键点 5】函数内修改全局数组需注意作用域,命令替换会产生子 Shell 数组。
  11. 【易错点 1】误区:认为数组在管道子 Shell 中修改会保留到父 Shell,实际不会,需要用进程替换或外部文件传递。
  12. 【易错点 2】风险:直接访问未定义下标会得到空字符串而非报错,容易掩盖逻辑错误。
  13. 【易错点 3】风险:删除数组中间元素不会自动重排下标,可能导致遍历时出现空值,需重新构建数组或使用关联数组。