1. 1. 1. 认识 BASH 这个 Shell
    1. 1.1. 1.1 什么是 Shell
    2. 1.2. 1.2 硬件、核心与 Shell 的关系
    3. 1.3. 1.3 为何要学习命令行的 Shell
    4. 1.4. 1.4 系统合法的 Shell 与 /etc/shells 功能
  2. 2. 2. Shell 的变量功能
    1. 2.1. 2.1 什么是变量
    2. 2.2. 2.2 变量的显示与设置
    3. 2.3. 2.3 变量设置规则
    4. 2.4. 2.4 环境变量
    5. 2.5. 2.5 export:将自定义变量转成环境变量
    6. 2.6. 2.6 read:读取用户输入
    7. 2.7. 2.7 declare / typeset:声明变量类型
    8. 2.8. 2.8 ulimit:限制用户系统资源
    9. 2.9. 2.9 变量内容的删除、替换与取代
  3. 3. 3. 命令别名与历史命令
    1. 3.1. 3.1 命令别名设置
    2. 3.2. 3.2 历史命令
  4. 4. 4. Bash Shell 的操作环境
    1. 4.1. 4.1 命令执行的优先级
    2. 4.2. 4.2 type:查看命令类型
    3. 4.3. 4.3 配置文件
    4. 4.4. 4.4 终端环境设置
  5. 5. 5. 数据流重定向
    1. 5.1. 5.1 标准输入输出代码
    2. 5.2. 5.2 重定向符号
    3. 5.3. 5.3 输入重定向
    4. 5.4. 5.4 /dev/null:黑洞装置
  6. 6. 6. 命令执行的判断依据
  7. 7. 7. 管道命令(Pipe)
    1. 7.1. 7.1 管道命令的特性
    2. 7.2. 7.2 管线命令与减号 - 的用途
  8. 8. 8. 常用管道命令详解
    1. 8.1. 8.1 cut:选取命令
    2. 8.2. 8.2 grep:分析命令
    3. 8.3. 8.3 sort:排序命令
    4. 8.4. 8.4 uniq:去重命令
    5. 8.5. 8.5 wc:统计命令
    6. 8.6. 8.6 tee:双向重定向
    7. 8.7. 8.7 tr:字符转换命令
    8. 8.8. 8.8 col:格式化命令
    9. 8.9. 8.9 join:文件连接命令
    10. 8.10. 8.10 paste:文件粘贴命令
    11. 8.11. 8.11 expand:tab转空格
    12. 8.12. 8.12 split:文件切割命令
    13. 8.13. 8.13 xargs:参数代换命令
  9. 9. 9. 重点命令速查
  10. 10. 10. 核心要点
    1. 10.1. 10.1 BASH 的重要性
    2. 10.2. 10.2 变量核心规则
    3. 10.3. 10.3 数据流重定向要点
    4. 10.4. 10.4 管道命令使用建议
    5. 10.5. 10.5 环境配置文件
    6. 10.6. 10.6 终端快捷键

Linux学习日志(7) 认识与学习BASH

参考资料:鳥哥私房菜 - 第十章、認識與學習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 变量的显示与设置

显示变量:

1
2
3
echo $变量名
# 或
echo ${变量名}

设置变量:

1
变量名=变量值

取消变量:

1
unset 变量名

2.3 变量设置规则

规则 说明
变量=变量值 等号两边不能直接接空格
变量名只能是字母和数字 开头字符不能是数字
双引号 " " 内的特殊字符(如 $)可保有原本特性
单引号 ' ' 内的特殊字符仅为一般字符(纯文本)
转义符 \ 可将特殊符号变成一般字符
反引号 `命令`$(命令) 先执行命令,结果作为外部的输入信号

示例:

1
2
3
name="John Doe"
version=$(uname -r) # 等价于 version=`uname -r`
echo "My name is $name"

2.4 环境变量

查看环境变量:

1
2
3
env          # 查看所有环境变量
export # 查看环境变量(同 env)
set # 查看所有变量(含环境变量和自定义变量)

常见环境变量:

变量 说明
PATH 命令搜索路径
HOME 用户家目录
SHELL 当前使用的 Shell
USER 当前用户名
LANG 语系数据
$? 前一个指令执行后的回传值(0 代表成功)

2.5 export:将自定义变量转成环境变量

  • 子进程仅会继承父进程的环境变量,不会继承自定义变量
  • 使用 export 可将自定义变量转换为环境变量,被子进程继承
1
export 变量名

2.6 read:读取用户输入

1
read [-pt] 变量名
  • -p:后接提示符
  • -t:等待的秒数

示例:

1
2
read -p "请输入您的姓名:" name
read -t 10 -p "请在10秒内输入:" answer

2.7 declare / typeset:声明变量类型

1
declare [-aixr] 变量名
  • -i:声明为整数类型
  • -a:声明为数组
  • -x:设置为环境变量
  • -r:设置为只读

示例:

1
declare -i sum=1+2+3    # sum=6

2.8 ulimit:限制用户系统资源

1
ulimit [-SHacdflmnpstuv] [配额]
  • 可限制:文件大小、CPU 时间、内存总量、打开文件数量等

示例:

1
ulimit -f 10240    # 限制只能创建 10MB 以下的文件

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 命令执行的优先级

  1. alias(命令别名)
  2. shell builtin(Shell 内置命令)
  3. $PATH(按 PATH 路径查找外部命令)

4.2 type:查看命令类型

1
type [-tpa] 命令名
  • 可判断命令是 alias、builtin 还是外部命令

4.3 配置文件

Login Shell(登录后取得)读取顺序:

  1. /etc/profile(系统整体设置)
  2. ~/.bash_profile~/.bash_login~/.profile

Non-login Shell(如终端中启动 bash)读取:

  • ~/.bashrc

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

# Here Document(多行输入)
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
  • 使用 - 可以替代 stdoutstdin

示例:

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    # 取第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 自身
grep -A5 'ERROR' logfile # 显示错误行及之后5行

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    # 按第3字段(UID)数字排序
last | cut -d ' ' -f1 | sort | uniq -c # 统计登录次数

8.4 uniq:去重命令

1
uniq [-ic]
  • -i:忽略大小写
  • -c:进行计数

注意: uniq 统计的是相邻行的信息,所以统计前需要先 sort

示例:

1
last | cut -d ' ' -f1 | sort | uniq -c

8.5 wc:统计命令

1
wc [-lwm]
  • -l:仅列出行数
  • -w:仅列出列数(单词数)
  • -m:字符数

示例:

1
2
wc -l /etc/passwd        # 统计文件行数
ls -l | wc -l # 统计当前目录文件数

8.6 tee:双向重定向

1
tee [-a] file
  • -a:以追加方式写入
  • 功能:同时将数据流分送到文件与屏幕

示例:

1
ls -l | tee output.txt | grep 'txt'

8.7 tr:字符转换命令

1
tr [-ds] SET1
  • -d:删除信息中的指定字符
  • -s:替换重复字符

示例:

1
2
3
last | tr '[a-z]' '[A-Z]'           # 小写转大写
cat /etc/passwd | tr -d ':' # 删除冒号
echo "hello world" | tr -s ' ' # 压缩多个空格为一个

8.8 col:格式化命令

1
col [-x]
  • -x:将 tab 键转换为对等的空格键

示例:

1
man ls | col -x | cat -A    # 将 man page 中的 tab 转为空格

8.9 join:文件连接命令

1
join [-ti12] file1 file2
  • 将两个文件中具有相同数据的那一行加在一起

8.10 paste:文件粘贴命令

1
paste [-d] file1 file2
  • 直接将两行贴在一起,中间用 tab 键隔开

8.11 expand:tab转空格

1
expand [-t] file
  • -t n:指定 tab 转换为 n 个空格(默认 8 个)

8.12 split:文件切割命令

1
split [-bl] file PREFIX
  • -b:按文件大小切割(可加单位 b, k, m)
  • -l:按行数切割

示例:

1
2
3
4
5
split -b 300k /etc/services services    # 每300k一个文件,前缀为services
split -l 1000 bigfile.txt part_ # 每1000行切割为一个文件

# 合并
cat part_* > original_file

8.13 xargs:参数代换命令

功能: xargs 可以读入 stdin 的数据,并以空格符或断行字符作为分辨,将 stdin 的数据分隔成为 arguments

1
xargs [-0epn] command

注意: 某些指令需要文件名来处理时,该 stdin 与 stdout 可以利用减号 - 来替代

示例:

1
2
find /usr/sbin -perm 700 | xargs ls -l    # 将 find 结果作为 ls 的参数
cat file.txt | xargs -n 3 echo # 每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 命令/文件补全