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,是在创建用户时分配的。
- 查看当前 Shell:
echo $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(正确)vs2>&1 > file(错误,仅 stderr 去 file)
【延伸追问】
- 如何将标准输出和错误输出分别重定向到不同文件?
2>/dev/null的作用是什么?
【易错坑点】
2>&1必须在> file之后写,顺序颠倒会导致 stderr 未重定向到文件&>是 Bash 扩展语法,POSIX sh 不兼容
Shell 脚本传参方法有哪几种?
【题目】 Shell 脚本传参方法有哪几种?
【参考答案】 Shell 脚本传参主要依赖以下方式:
- 位置参数:
$1,$2,$3… 按顺序获取传入参数 - 特殊变量:
$@:所有参数列表(每个参数独立)$*:所有参数(单字符串)$#:参数个数$0:脚本名称
- 环境变量:通过
export传递 getopts:解析选项参数(如-a,-b value)read:交互式读取用户输入
【延伸追问】
$@和$*在双引号内使用时有什么区别?shift命令的作用是什么?
【易错坑点】
$@加引号"$@"会保留参数独立性,$*会将所有参数拼成一个字符串- 参数从
$1开始,$0是脚本名不是参数
Shell 脚本中 ”$?” 标记的用途是什么?
【题目】 Shell 脚本中 ”$?” 标记的用途是什么?
【参考答案】
$? 用于检查前一命令是否执行成功。
- 返回
0:命令执行成功 - 返回非
0:命令执行失败(不同错误码代表不同错误类型)
典型用法:
if [ $? -eq 0 ]; then
echo "命令执行成功"
else
echo "命令执行失败"
fi
【延伸追问】
- 如何自定义脚本或函数的退出码?
- 常见的退出码(1、127、137)分别代表什么含义?
【易错坑点】
$?只记录上一条命令的退出状态,必须在执行后立即检查- 中间插入
echo等命令会覆盖$?的值
可以在 Shell 脚本中使用哪些类型的变量?
【题目】 可以在 Shell 脚本中使用哪些类型的变量?
【参考答案】 两种类型:
-
系统定义变量(环境变量)
- 由系统自动创建,通常大写字母
- 可通过
set或env命令查看 - 示例:
PATH、HOME、USER、SHELL
-
用户定义变量
- 由用户创建和赋值
- 通过
echo $<变量名>查看 - 示例:
name="hello"、count=10
【延伸追问】
- 环境变量和局部变量的作用域有什么区别?
- 如何将局部变量变为环境变量?
【易错坑点】
=两侧不能有空格:name = "hello"是错误的- 变量赋值默认为字符串,数值运算需使用
$[]或$(())
Shell 脚本中 break 命令的作用?
【题目】 Shell 脚本中 break 命令的作用?
【参考答案】
break 命令用于退出执行中的循环。
- 在
for、while、until循环中使用 - 不带参数:退出当前循环
- 带参数
break n:退出 n 层嵌套循环
for i in {1..10}; do
if [ $i -eq 5 ]; then
break # i=5 时退出循环
fi
echo $i
done
【延伸追问】
break和continue的区别是什么?- 如何在多层嵌套循环中跳出到最外层?
【易错坑点】
break只能用在循环中,不能在case语句中用于跳出break n的 n 必须是正整数
Shell 脚本的运行方式有哪些?区别?
【题目】 Shell 脚本的运行方式有哪些?区别?
【参考答案】 四种运行方式:
| 方式 | 命令 | 执行环境 | 特点 |
|---|---|---|---|
| 子 Shell | sh script.sh | 子 Shell | 变量修改不影响父 Shell |
| 直接执行 | chmod +x && ./script.sh | 子 Shell | 需要执行权限 |
| source | source script.sh | 当前 Shell | 变量修改影响父 Shell,环境刷新 |
| 点命令 | . script.sh | 当前 Shell | 等同 source,语法更简洁 |
【延伸追问】
- 为什么修改了
.bashrc后需要source才能生效? sh script.sh和./script.sh有什么本质区别?
【易错坑点】
source执行的脚本里如果包含exit,会退出当前终端./script.sh需要脚本首行有 shebang(#!/bin/bash)
如何调试 Shell 脚本?
【题目】 如何调试 Shell 脚本?
【参考答案】 两种调试方法:
-
-x参数(最常用):sh -x myscript.sh- 显示每条命令的执行过程
+前缀表示实际执行的命令
-
-nv参数:sh -nv myscript.sh-n:只检查语法,不执行-v:显示输入的原始行
-
脚本内开启:在脚本中插入
set -x(开启)和set +x(关闭)
【延伸追问】
set -e的作用是什么?- 如何只调试脚本的某一部分?
【易错坑点】
- 生产环境慎用
-x,可能泄露敏感信息(密码、密钥) set -e会使脚本在任何命令失败时退出,需谨慎使用
关联文档
- ../../脚本与编程 — Shell/Python 编程主页
- ../../../linux/system/Linux — 命令环境