参考资料:鳥哥私房菜 - 第十章、認識與學習BASH
1. 认识 BASH 这个 Shell
1.1 什么是 Shell
- 管理计算机硬件的其实是操作系统的核心(Kernel),这个核心需要被保护
- 我们只能通过 Shell 将输入的指令与 Kernel 沟通,让 Kernel 控制硬件来正确无误地工作
- Shell 是用户与操作系统核心之间的接口程序
1.2 硬件、核心与 Shell 的关系
- 当你要计算机输出声音时:需要硬件(声卡)→ 核心管理(驱动支持)→ 应用程序(输入指令)
- Shell 的功能是提供用户操作系统的接口,可以调用其他软件
- 狭义的壳程序指命令行方面的软件(如 bash)
- 广义的壳程序包括图形接口的软件(GUI)
1.3 为何要学习命令行的 Shell
① 命令行 Shell 在各 distribution 都一样
- X Window 和 Web 接口工具在不同发行版中各不相同
- 命令行 Shell(bash)在各家 distributions 几乎相同
- 学会后可轻松切换不同的 Linux 发行版
② 远端管理时命令行速度更快
- 远程连接时命令行传输速度快
- 不易出现断线或信息外流问题
③ Shell 是 Linux 的“任督二脉”
- 良好的 Shell 程序编写是系统管理的关键
- 通过 Shell 脚本可高效分析日志、自动化管理任务
- 很多面试岗位要求有 Shell 脚本编写经验
1.4 系统合法的 Shell 与 /etc/shells 功能
常见的 Shell 类型:
| Shell |
说明 |
/bin/sh |
Bourne Shell,已被 bash 取代 |
/bin/bash |
Bourne Again SHell,Linux 默认 Shell |
/bin/tcsh |
整合 C Shell,提供更多功能 |
/bin/csh |
C Shell,已被 tcsh 取代 |
/etc/shells 的作用:
- 记录系统合法可用的 Shell
- 系统服务会通过此文件检查用户可使用的 Shell
- 如
/sbin/nologin 是一种“怪怪的 shell”,用于限制用户登录
默认 Shell 记录位置:
- 用户登录后取得的默认 Shell 记录在
/etc/passwd 的最后一个字段
- root 用户默认使用
/bin/bash,系统账号通常使用 /sbin/nologin
2. Shell 的变量功能
2.1 什么是变量
- 变量是以一组文字或符号来取代一些设置或一串保留的数据
- 变量分为环境变量(全局变量)与自定义变量(局部变量)
2.2 变量的显示与设置
显示变量:
设置变量:
取消变量:
2.3 变量设置规则
| 规则 |
说明 |
变量=变量值 |
等号两边不能直接接空格 |
| 变量名只能是字母和数字 |
开头字符不能是数字 |
双引号 " " |
内的特殊字符(如 $)可保有原本特性 |
单引号 ' ' |
内的特殊字符仅为一般字符(纯文本) |
转义符 \ |
可将特殊符号变成一般字符 |
反引号 `命令` 或 $(命令) |
先执行命令,结果作为外部的输入信号 |
示例:
1 2 3
| name="John Doe" version=$(uname -r) echo "My name is $name"
|
2.4 环境变量
查看环境变量:
常见环境变量:
| 变量 |
说明 |
PATH |
命令搜索路径 |
HOME |
用户家目录 |
SHELL |
当前使用的 Shell |
USER |
当前用户名 |
LANG |
语系数据 |
$? |
前一个指令执行后的回传值(0 代表成功) |
2.5 export:将自定义变量转成环境变量
- 子进程仅会继承父进程的环境变量,不会继承自定义变量
- 使用
export 可将自定义变量转换为环境变量,被子进程继承
2.6 read:读取用户输入
示例:
1 2
| read -p "请输入您的姓名:" name read -t 10 -p "请在10秒内输入:" answer
|
2.7 declare / typeset:声明变量类型
-i:声明为整数类型
-a:声明为数组
-x:设置为环境变量
-r:设置为只读
示例:
2.8 ulimit:限制用户系统资源
1
| ulimit [-SHacdflmnpstuv] [配额]
|
- 可限制:文件大小、CPU 时间、内存总量、打开文件数量等
示例:
2.9 变量内容的删除、替换与取代
常用模式:
| 语法 |
说明 |
${var#pattern} |
从变量开头删除最短匹配 |
${var##pattern} |
从变量开头删除最长匹配 |
${var%pattern} |
从变量结尾删除最短匹配 |
${var%%pattern} |
从变量结尾删除最长匹配 |
${var/old/new} |
替换第一个匹配的字符串 |
${var//old/new} |
替换所有匹配的字符串 |
3. 命令别名与历史命令
3.1 命令别名设置
1 2
| alias 别名='命令' unalias 别名
|
示例:
1 2
| alias lm='ls -l | more' alias rm='rm -i'
|
3.2 历史命令
1 2 3
| history [n] history -c history -w
|
常用操作:
| 操作 |
说明 |
!! |
执行上一个命令 |
!number |
执行第 number 个命令 |
!command |
执行最近以 command 开头的命令 |
Ctrl + r |
搜索历史命令 |
4. Bash Shell 的操作环境
4.1 命令执行的优先级
- alias(命令别名)
- shell builtin(Shell 内置命令)
- $PATH(按 PATH 路径查找外部命令)
4.2 type:查看命令类型
- 可判断命令是 alias、builtin 还是外部命令
4.3 配置文件
Login Shell(登录后取得)读取顺序:
/etc/profile(系统整体设置)
~/.bash_profile 或 ~/.bash_login 或 ~/.profile
Non-login Shell(如终端中启动 bash)读取:
source:读取配置文件使其立即生效
1 2 3
| source ~/.bashrc
. ~/.bashrc
|
4.4 终端环境设置
| 命令 |
说明 |
stty -a |
查看所有终端设置 |
set |
查看所有变量 |
Ctrl + s |
冻结屏幕(画面停止) |
Ctrl + q |
解除冻结 |
5. 数据流重定向
5.1 标准输入输出代码
| 代码 |
名称 |
代号 |
符号 |
| 0 |
标准输入(stdin) |
STDIN |
< 或 << |
| 1 |
标准输出(stdout) |
STDOUT |
> 或 >> |
| 2 |
标准错误输出(stderr) |
STDERR |
2> 或 2>> |
5.2 重定向符号
1 2 3 4 5 6 7 8 9 10 11
| command > file command >> file
command 2> file command 2> /dev/null
command &> file command > file 2>&1
|
5.3 输入重定向
1 2 3 4 5 6 7 8
| command < file
cat > file << EOF line 1 line 2 EOF
|
5.4 /dev/null:黑洞装置
- 任何写入
/dev/null 的数据都会被丢弃
- 常用于丢弃不需要的输出信息
6. 命令执行的判断依据
| 符号 |
说明 |
示例 |
; |
顺序执行,不管前一个命令是否成功 |
sync; sync; shutdown -h now |
&& |
前一个命令成功才执行后一个 |
make && make install |
|| |
前一个命令失败才执行后一个 |
command || echo "失败" |
7. 管道命令(Pipe)
7.1 管道命令的特性
- 仅处理标准输出(stdout):对于标准错误输出会忽略
- 必须能接收标准输入:管道命令必须能够接受前一个命令的数据作为标准输入继续处理
7.2 管线命令与减号 - 的用途
- 某些指令需要文件名来处理(如
tar)
- 使用
- 可以替代 stdout 或 stdin
示例:
1
| tar -cvf - /home | tar -xvf - -C /tmp/homeback
|
8. 常用管道命令详解
8.1 cut:选取命令
1 2
| cut -d '分隔字符' -f fields cut -c 字符范围
|
-d:后接分隔字符(与 -f 一起使用)
-f:根据 -d 的分隔取出第几段
-c:以字符为单位取出
示例:
1 2
| echo "姓名:年龄:城市" | cut -d ':' -f 1,3 ls -l | cut -d ' ' -f 1,3
|
8.2 grep:分析命令
1
| grep [-acinv] '搜索字符串' filename
|
-c:打印匹配的行数
-i:忽略大小写
-n:显示行号
-v:反向查找(显示不匹配的行)
-w:匹配整个单词
-E:支持扩展正则表达式(过滤多个参数)
-A n:显示匹配行及其后 n 行(after)
-B n:显示匹配行及其前 n 行(before)
-C n:显示匹配行及其前后各 n 行(context)
示例:
1 2 3
| grep -n 'error' /var/log/messages ps aux | grep -v 'grep' | grep 'nginx' grep -A5 'ERROR' logfile
|
8.3 sort:排序命令
1
| sort [-fbMnrtuk] [file or stdin]
|
-f:忽略大小写差异
-b:忽略最前面的空格符
-M:以月份名字排序(如 JAN, DEC)
-n:使用纯数字排序
-r:反向排序
-u:去重(相当于 uniq)
-t:指定分隔符
-k:以哪个字段排序
示例:
1 2
| cat /etc/passwd | sort -t ':' -k 3 -n last | cut -d ' ' -f1 | sort | uniq -c
|
8.4 uniq:去重命令
注意: uniq 统计的是相邻行的信息,所以统计前需要先 sort
示例:
1
| last | cut -d ' ' -f1 | sort | uniq -c
|
8.5 wc:统计命令
-l:仅列出行数
-w:仅列出列数(单词数)
-m:字符数
示例:
1 2
| wc -l /etc/passwd ls -l | wc -l
|
8.6 tee:双向重定向
-a:以追加方式写入
- 功能:同时将数据流分送到文件与屏幕
示例:
1
| ls -l | tee output.txt | grep 'txt'
|
8.7 tr:字符转换命令
示例:
1 2 3
| last | tr '[a-z]' '[A-Z]' cat /etc/passwd | tr -d ':' echo "hello world" | tr -s ' '
|
8.8 col:格式化命令
示例:
1
| man ls | col -x | cat -A
|
8.9 join:文件连接命令
1
| join [-ti12] file1 file2
|
8.10 paste:文件粘贴命令
8.11 expand:tab转空格
-t n:指定 tab 转换为 n 个空格(默认 8 个)
8.12 split:文件切割命令
-b:按文件大小切割(可加单位 b, k, m)
-l:按行数切割
示例:
1 2 3 4 5
| split -b 300k /etc/services services split -l 1000 bigfile.txt part_
cat part_* > original_file
|
8.13 xargs:参数代换命令
功能: xargs 可以读入 stdin 的数据,并以空格符或断行字符作为分辨,将 stdin 的数据分隔成为 arguments
注意: 某些指令需要文件名来处理时,该 stdin 与 stdout 可以利用减号 - 来替代
示例:
1 2
| find /usr/sbin -perm 700 | xargs ls -l cat file.txt | xargs -n 3 echo
|
9. 重点命令速查
| 分类 |
命令 |
用途 |
| 变量 |
echo |
显示变量内容 |
|
env / export |
查看环境变量 |
|
set |
查看所有变量 |
|
unset |
取消变量 |
|
read |
读取用户输入 |
|
declare |
声明变量类型 |
|
ulimit |
限制系统资源 |
| 别名与历史 |
alias |
设置命令别名 |
|
history |
查看历史命令 |
|
type |
查看命令类型 |
| 数据流重定向 |
> / >> |
输出重定向 |
|
2> / 2>> |
错误输出重定向 |
|
< / << |
输入重定向 |
|
/dev/null |
丢弃数据 |
| 管道命令 |
cut |
切割字段 |
|
grep |
搜索文本 |
|
sort |
排序 |
|
uniq |
去重 |
|
wc |
统计 |
|
tee |
双向重定向 |
|
tr |
字符转换 |
|
split |
切割文件 |
|
xargs |
参数代换 |
10. 核心要点
10.1 BASH 的重要性
- Shell 是用户与核心沟通的接口,bash 是 Linux 默认的 Shell
- 学习 Shell 的原因:各 distribution 通用、远程管理速度快、是系统管理的核心技能
- 鸟哥用“打通任督二脉”来形容 Shell 的重要性
10.2 变量核心规则
- 等号两边不能有空格,变量名开头不能是数字
- 双引号可解析变量,单引号视为纯文本
export 使局部变量变成全局变量(环境变量)
$? 检查上一个命令是否成功(0 代表成功)
10.3 数据流重定向要点
1> 是标准输出,2> 是标准错误输出
- 管道命令
| 只处理标准输出,忽略标准错误
/dev/null 是“黑洞”,用于丢弃不需要的输出
10.4 管道命令使用建议
- 管道命令必须能接收标准输入
- 常用组合:
grep 搜索 → sort 排序 → uniq 去重 → wc 统计
xargs 用于将管道输出转为其他命令的参数
10.5 环境配置文件
/etc/profile:系统级配置(login shell 读取)
~/.bashrc:用户级配置(non-login shell 读取)
- 修改后执行
source ~/.bashrc 立即生效
10.6 终端快捷键
| 快捷键 |
作用 |
Ctrl + c |
中断当前命令 |
Ctrl + d |
退出终端(EOF) |
Ctrl + s |
冻结屏幕 |
Ctrl + q |
解除冻结 |
Ctrl + r |
搜索历史命令 |
Tab |
命令/文件补全 |