主流 Shell(如 Bash)的内置命令数量通常在 几十个(而非 80 个)。
以下以最常用的 Bash 为例,分类整理其核心内置命令,并说明功能。
**NAME
bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, compgen,
complete, compopt, continue, declare, dirs, disown, echo, enable, eval,
exec, exit, export, false, fc, fg, getopts,hash, help, history, jobs, kill,
let, local, logout, mapfile, popd, printf, pushd, pwd, read, readonly,
return, set, shift, shopt, source, suspend, test, times, trap, true,
type, typeset, ulimit,umask, unalias, unset, wait - bash built-in commands,
see bash(1)
一、Bash 内置命令分类及详解
Bash 的内置命令可分为以下几类,覆盖 Shell 自身管理、流程控制、变量操作、进程管理等场景。
1. Shell 自身管理与元命令
这类命令用于控制 Shell 的运行状态、解析规则或调试。
命令 | 功能描述 |
---|---|
: | 空命令(Null Command),仅返回状态码 0 (常用于条件语句占位或循环体)。示例: while :; do sleep 1; done (无限循环)。 |
. (或 source ) | 在当前 Shell 环境中执行指定脚本文件(而非子 Shell),脚本中对变量/函数的修改会影响当前 Shell。 示例: . ./config.sh 或 source ./config.sh 。 |
alias | 定义或查看别名(Alias)。 示例: alias ll='ls -l' (定义别名);alias (查看所有别名)。 |
unalias | 删除已定义的别名。 示例: unalias ll 。 |
bash | 启动一个新的 Bash 子 Shell(可通过参数调整行为,如 bash -c 'echo hello' )。 |
exit | 终止当前 Shell 或子 Shell,并返回指定的退出状态码(默认 0 )。示例: exit 1 (终止并返回错误码 1)。 |
exec | 用指定命令替换当前 Shell 进程(不创建新进程)。 示例: exec ./app (当前 Shell 变为 app 进程)。 |
getopts | 解析命令行选项(用于脚本处理参数)。 示例: while getopts "a:b:" opt; do ... done (处理 -a val -b val 格式参数)。 |
hash | 管理 Shell 的命令路径缓存(加速命令查找)。 示例: hash (查看缓存);hash -r (清空缓存)。 |
pwd | 打印当前工作目录(Print Working Directory)。 示例: pwd (输出 /home/user )。 |
times | 显示 Shell 及其子进程的累计执行时间。 示例: times (输出用户时间和系统时间)。 |
trap | 设置信号捕获(当 Shell 收到指定信号时执行自定义命令)。 示例: trap 'echo 退出' EXIT (Shell 退出时执行 echo 退出 )。 |
umask | 设置或查看文件权限掩码(控制新建文件的默认权限)。 示例: umask 022 (默认文件权限 644 ,目录 755 )。 |
unset | 删除变量或函数。 示例: unset var (删除变量 var );unset -f func (删除函数 func )。 |
2. 流程控制与结构化命令
用于实现条件判断、循环等程序逻辑。
命令 | 功能描述 |
---|---|
if | 条件判断(配合 then /elif /else /fi )。示例: if [ $a -gt 10 ]; then echo "大"; elif [ $a -eq 10 ]; then echo "等于"; else echo "小"; fi 。 |
case | 多分支匹配(类似 switch-case )。示例: case $var in<br> "start") echo "启动" ;;<br> "stop") echo "停止" ;;<br> *) echo "未知" ;;<br>esac 。 |
for | 循环遍历列表(或命令输出)。 示例: for i in {1..5}; do echo $i; done (遍历 1-5);for file in *.txt; do cat $file; done (遍历所有 .txt 文件)。 |
while | 当条件为真时循环执行。 示例: while read line; do echo $line; done < file.txt (逐行读取文件并输出)。 |
until | 当条件为假时循环执行(与 while 相反)。示例: until [ $count -ge 5 ]; do echo $count; ((count++)); done (输出 0-4)。 |
select | 生成交互式菜单(从列表中选择选项)。 示例: select opt in "苹果" "香蕉" "退出"; do<br> if [ "$opt" = "退出" ]; then break; fi<br> echo "选择了:$opt"<br>done 。 |
break | 终止当前循环(for /while /until )。示例: for i in {1..10}; do if [ $i -eq 5 ]; then break; fi; echo $i; done (输出 1-4)。 |
continue | 跳过当前循环的剩余代码,进入下一次迭代。 示例: for i in {1..5}; do if [ $i -eq 3 ]; then continue; fi; echo $i; done (输出 1-2,4-5)。 |
3. 变量与参数操作
用于管理 Shell 变量、位置参数(如 $1
, $@
)或特殊参数(如 $#
)。
命令 | 功能描述 |
---|---|
declare | 声明变量类型(如整数、只读、数组等)。 示例: declare -i num=10 (声明整数变量);declare -r const=5 (声明只读变量);declare -a arr=(1 2 3) (声明数组)。 |
typeset | declare 的同义词(兼容旧版本)。 |
export | 将变量导出为环境变量(子进程可继承)。 示例: export PATH=$PATH:/usr/local/bin (将路径加入环境变量)。 |
local | 在函数内部声明局部变量(避免污染全局作用域)。 示例: func() { local x=10; echo $x; } (函数内 $x 不影响外部)。 |
readonly | 声明只读变量(不可修改或取消)。 示例: readonly PI=3.14 (尝试修改 PI=3 会报错)。 |
test | 测试条件表达式(返回状态码 0 或 1 )。示例: test -f file.txt (判断是否为普通文件);test $a -gt $b (判断 $a 是否大于 $b )。 |
[ ] | test 的同义词(需注意方括号内的空格)。示例: [ -z "$var" ] (判断变量是否为空)。 |
[[ ]] | 增强版条件测试(支持正则匹配、逻辑运算符 && /` |
4. 输入输出与重定向
用于控制数据输入来源或输出目标(部分命令需配合重定向符号 >
/<
使用)。
命令 | 功能描述 |
---|---|
read | 从标准输入读取一行数据到变量。 示例: read name (读取用户输入到 name );read -t 5 -p "请输入:" input (5 秒超时提示输入)。 |
printf | 格式化输出(类似 C 语言的 printf )。示例: `printf “姓名:%s,年龄:%d |
” “张三” 20(输出 姓名:张三,年龄:20`)。 | |
echo | 输出字符串(支持转义字符)。 示例:`echo “Hello |
World”(输出两行); echo -e “启用转义:\ | |
\t””( -e启用转义,输出 启用转义:\ “`)。 |
5. 进程与作业管理
用于控制后台任务、前台任务切换或进程终止。
命令 | 功能描述 |
---|---|
bg | 将暂停的作业(Job)放到后台继续运行。 示例: bg %1 (将作业 1 后台运行)。 |
fg | 将后台作业切换到前台运行。 示例: fg %2 (将作业 2 前台运行)。 |
jobs | 查看当前 Shell 中的后台作业状态。 示例: jobs -l (显示作业编号、PID、状态)。 |
kill | 终止指定进程或作业。 示例: kill 1234 (终止 PID 为 1234 的进程);kill %1 (终止作业 1)。 |
wait | 等待所有或指定后台作业完成。 示例: wait %1 (等待作业 1 完成);wait (等待所有后台作业)。 |
二、Bash 内置命令的数量统计
compgen -b | wc -l # 统计内置命令数量(输出约 60-70)
root# compgen -b|wc -l
61
三、内置命令 vs 外部命令
- 内置命令:由 Shell 直接执行,无需启动子进程(速度快),可访问 Shell 内部状态(如变量、作业)。
- 外部命令:独立可执行文件(如
/bin/ls
、/usr/bin/grep
),需通过fork()
+exec()
启动子进程(速度较慢),无法直接修改 Shell 内部状态(如无法用ls
定义变量)。
总结
实际主流 Shell(如 Bash)的内置命令数量约为 60-70 个,覆盖 Shell 自身管理、流程控制、变量操作等核心场景。掌握这些内置命令是编写高效 Shell 脚本的基础。