5.1.6 常用内建命令与帮助体系
本节聚焦常用内建命令与帮助体系,帮助快速掌握交互与脚本中的基础能力、定位命令用法与错误。内建命令由 Shell 直接执行,不经外部可执行文件,速度快、可移植性好,但不同 Shell 可能略有差异。
原理草图:命令解析与帮助体系
常用内建命令速览与示例#
1) 目录与路径
- cd:切换目录;cd - 返回上次目录
- pwd -P:输出真实路径(解析符号链接)
# 示例:目录切换与真实路径
pwd
cd /tmp
pwd
cd -
pwd -P
2) 输出与输入
- printf:格式化输出,移植性强
- echo:快速输出(避免依赖 -e)
- read -r:读取输入,避免反斜杠转义
- read -s:静默输入(如密码)
# 文件: /tmp/io_demo.sh
#!/usr/bin/env bash
printf "请输入用户名: "
read -r user
printf "请输入密码: "
read -rs pass
printf "\n用户=%s 长度=%d\n" "$user" "${#pass}"
chmod +x /tmp/io_demo.sh
/tmp/io_demo.sh
# 预期: 显示用户名与密码长度,密码不回显
3) 变量与环境
- export VAR=value:影响子进程
- unset VAR:删除变量或函数
# 文件: /tmp/env_demo.sh
#!/usr/bin/env bash
export APP_ENV=prod
bash -c 'echo "子进程APP_ENV=$APP_ENV"'
unset APP_ENV
echo "当前APP_ENV=${APP_ENV:-未设置}"
4) 命令类型与绕过别名
- type:显示命令来源
- command:绕过别名/函数执行外部命令
- command -v:查询可执行路径
# 交互环境示例
alias ls='ls --color=auto'
type ls
command ls /tmp
command -v ls
5) 条件与控制
- test/[/[[:条件判断,推荐 [[ ]]
- ::空命令,占位或返回真
- exit/return:退出脚本/函数
- set -euo pipefail:严格模式提升健壮性
# 文件: /tmp/cond_demo.sh
#!/usr/bin/env bash
set -euo pipefail
file="/etc/passwd"
if [[ -f "$file" ]]; then
printf "存在文件: %s\n" "$file"
else
printf "不存在文件: %s\n" "$file"
exit 1
fi
: # 占位命令
帮助体系与自查手段#
help 内建命令:内建命令帮助man bash/info bash:完整 Bash 手册type/command -v:排查命令来源help -d 关键词:关键词检索
# 常见帮助查询
help cd
help read
help -d export
man bash
info bash
type echo
command -v echo
安装与环境准备(适用于学习环境)#
内建命令无需安装,但建议确认 Shell 版本:
bash --version
# 预期: GNU bash, 版本号输出
如系统默认非 Bash,可安装并切换(示例以 Debian/Ubuntu 为例):
sudo apt-get update
sudo apt-get install -y bash
chsh -s /bin/bash
排错清单#
1) 命令行为异常:先用 type 命令 确认是否被别名或函数覆盖
2) 脚本中 echo 输出不一致:使用 printf 替换
3) read 读取路径失败:使用 read -r 禁止反斜杠转义
4) 条件判断报错:空变量在 [ 中易出错,改用 [[ ]]
5) 脚本中断:检查是否开启 set -e,在可忽略失败处使用 || true
# 排错示例:判断命令来源
type ls
unalias ls 2>/dev/null || true
type ls
练习#
1) 编写脚本:要求读取用户名、密码(静默),并输出用户名与密码长度
2) 编写脚本:检查 /var/log/syslog 是否存在,存在则输出前 3 行,否则退出 1
3) 练习 type 与 command -v:对 echo、ls、cd 分别判断来源
4) 练习 [[ ]]:判断输入是否为数字并输出结果
# 练习2参考
# 文件: /tmp/check_log.sh
#!/usr/bin/env bash
set -euo pipefail
log="/var/log/syslog"
if [[ -f "$log" ]]; then
head -n 3 "$log"
else
echo "日志不存在: $log"
exit 1
fi
小结
掌握内建命令能提升脚本执行效率与可控性;熟悉 help、man bash、type 等帮助体系,有助于快速定位语法与错误来源,为后续复杂脚本打下稳定基础。