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) 练习 typecommand -v:对 echolscd 分别判断来源
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

小结
掌握内建命令能提升脚本执行效率与可控性;熟悉 helpman bashtype 等帮助体系,有助于快速定位语法与错误来源,为后续复杂脚本打下稳定基础。