Shell

·9 分钟阅读·3203 字
📋 目录

Shell 脚本面试题


什么是 Shell?

【题目】 什么是 Shell?

【参考答案】 Shell 是一个命令解释器,是用户与 Linux 内核之间的桥梁。它将用户输入的命令转换为系统可执行的指令。

  • 核心功能:接收用户输入 → 解析命令 → 调用系统调用执行 → 返回结果
  • 常见 Shell/bin/bash(默认)、/bin/zsh/bin/sh

【延伸追问】

  • Bash 和 Zsh 的主要区别是什么?
  • Shell 如何查找并执行命令(PATH 机制)?

【易错坑点】

  • Shell 本身只是一个解释器,不是操作系统的一部分
  • 不同 Shell 语法有细微差异,脚本首行 #!/bin/bash 指定解释器

什么是默认登录 Shell,如何改变指定用户的登录 Shell?

【题目】 什么是默认登录 Shell,如何改变指定用户的登录 Shell?

【参考答案】 在 Linux 操作系统,/bin/bash 是默认登录 Shell,是在创建用户时分配的。

  • 查看当前 Shellecho $SHELL
  • 更改用户 Shell:使用 chsh 命令(chsh -s /bin/zsh 用户名
  • 修改配置文件:直接编辑 /etc/passwd 文件中用户行最后一个字段

【延伸追问】

  • /etc/shells 文件的作用是什么?
  • 如何查看系统支持的所有 Shell?

【易错坑点】

  • chsh 只修改登录 Shell,不影响已登录会话
  • 必须使用 /etc/shells 中列出的合法 Shell

如何将标准输出和错误输出同时重定向到同一位置?

【题目】 如何将标准输出和错误输出同时重定向到同一位置?

【参考答案】 两种方法:

方法一:2>&1

ls /usr/share/doc > out.txt 2>&1

方法二:&>

ls /usr/share/doc &> out.txt
  • 1>:标准输出重定向(可省略 1
  • 2>:错误输出重定向
  • 2>&1:将错误输出重定向到标准输出的目标位置
  • 顺序重要:> file 2>&1(正确)vs 2>&1 > file(错误,仅 stderr 去 file)

【延伸追问】

  • 如何将标准输出和错误输出分别重定向到不同文件?
  • 2>/dev/null 的作用是什么?

【易错坑点】

  • 2>&1 必须在 > file 之后写,顺序颠倒会导致 stderr 未重定向到文件
  • &> 是 Bash 扩展语法,POSIX sh 不兼容

Shell 脚本传参方法有哪几种?

【题目】 Shell 脚本传参方法有哪几种?

【参考答案】 Shell 脚本传参主要依赖以下方式:

  1. 位置参数$1, $2, $3 … 按顺序获取传入参数
  2. 特殊变量
    • $@:所有参数列表(每个参数独立)
    • $*:所有参数(单字符串)
    • $#:参数个数
    • $0:脚本名称
  3. 环境变量:通过 export 传递
  4. getopts:解析选项参数(如 -a, -b value
  5. read:交互式读取用户输入

【延伸追问】

  • $@$* 在双引号内使用时有什么区别?
  • shift 命令的作用是什么?

【易错坑点】

  • $@ 加引号 "$@" 会保留参数独立性,$* 会将所有参数拼成一个字符串
  • 参数从 $1 开始,$0 是脚本名不是参数

Shell 脚本中 ”$?” 标记的用途是什么?

【题目】 Shell 脚本中 ”$?” 标记的用途是什么?

【参考答案】 $? 用于检查前一命令是否执行成功

  • 返回 0:命令执行成功
  • 返回非 0:命令执行失败(不同错误码代表不同错误类型)

典型用法

if [ $? -eq 0 ]; then
    echo "命令执行成功"
else
    echo "命令执行失败"
fi

【延伸追问】

  • 如何自定义脚本或函数的退出码?
  • 常见的退出码(1、127、137)分别代表什么含义?

【易错坑点】

  • $? 只记录上一条命令的退出状态,必须在执行后立即检查
  • 中间插入 echo 等命令会覆盖 $? 的值

可以在 Shell 脚本中使用哪些类型的变量?

【题目】 可以在 Shell 脚本中使用哪些类型的变量?

【参考答案】 两种类型:

  1. 系统定义变量(环境变量)

    • 由系统自动创建,通常大写字母
    • 可通过 setenv 命令查看
    • 示例:PATHHOMEUSERSHELL
  2. 用户定义变量

    • 由用户创建和赋值
    • 通过 echo $<变量名> 查看
    • 示例:name="hello"count=10

【延伸追问】

  • 环境变量和局部变量的作用域有什么区别?
  • 如何将局部变量变为环境变量?

【易错坑点】

  • = 两侧不能有空格:name = "hello" 是错误的
  • 变量赋值默认为字符串,数值运算需使用 $[]$(())

Shell 脚本中 break 命令的作用?

【题目】 Shell 脚本中 break 命令的作用?

【参考答案】 break 命令用于退出执行中的循环

  • forwhileuntil 循环中使用
  • 不带参数:退出当前循环
  • 带参数 break n:退出 n 层嵌套循环
for i in {1..10}; do
    if [ $i -eq 5 ]; then
        break  # i=5 时退出循环
    fi
    echo $i
done

【延伸追问】

  • breakcontinue 的区别是什么?
  • 如何在多层嵌套循环中跳出到最外层?

【易错坑点】

  • break 只能用在循环中,不能在 case 语句中用于跳出
  • break n 的 n 必须是正整数

Shell 脚本的运行方式有哪些?区别?

【题目】 Shell 脚本的运行方式有哪些?区别?

【参考答案】 四种运行方式:

方式命令执行环境特点
子 Shellsh script.sh子 Shell变量修改不影响父 Shell
直接执行chmod +x && ./script.sh子 Shell需要执行权限
sourcesource script.sh当前 Shell变量修改影响父 Shell,环境刷新
点命令. script.sh当前 Shell等同 source,语法更简洁

【延伸追问】

  • 为什么修改了 .bashrc 后需要 source 才能生效?
  • sh script.sh./script.sh 有什么本质区别?

【易错坑点】

  • source 执行的脚本里如果包含 exit,会退出当前终端
  • ./script.sh 需要脚本首行有 shebang(#!/bin/bash

如何调试 Shell 脚本?

【题目】 如何调试 Shell 脚本?

【参考答案】 两种调试方法:

  1. -x 参数(最常用):sh -x myscript.sh

    • 显示每条命令的执行过程
    • + 前缀表示实际执行的命令
  2. -nv 参数sh -nv myscript.sh

    • -n:只检查语法,不执行
    • -v:显示输入的原始行
  3. 脚本内开启:在脚本中插入 set -x(开启)和 set +x(关闭)

【延伸追问】

  • set -e 的作用是什么?
  • 如何只调试脚本的某一部分?

【易错坑点】

  • 生产环境慎用 -x,可能泄露敏感信息(密码、密钥)
  • set -e 会使脚本在任何命令失败时退出,需谨慎使用

关联文档

  • ../../脚本与编程 — Shell/Python 编程主页
  • ../../../linux/system/Linux — 命令环境