目录
- [Bash 简介与基础](#Bash 简介与基础)
- 基本命令与文件操作
- 权限管理与用户管理
- 重定向与管道
- 变量与环境变量
- 通配符与正则表达式
- [Shell 脚本结构与控制流](#Shell 脚本结构与控制流)
- 常用内建命令与技巧
- 文本处理常用命令
- 作业控制与进程管理
- 别名与函数
- 实用技巧与注意事项
- [更多 Bash 进阶话题](#更多 Bash 进阶话题)
- 参考资源
1. Bash 简介与基础
1.1 什么是 Bash
- Bash(Bourne-Again SHell):一种常见的 Unix/Linux Shell(命令解释器),也是在大多数 Linux 发行版中的默认 Shell。
- Shell 的作用:提供命令执行与脚本编写环境,是用户与操作系统内核交互的接口。
1.2 如何进入 Bash
-
登录终端 后默认即进入 Bash。如果使用的是其他 Shell(如
zsh
),可输入bash
切换到 Bash。 -
查看当前 Shell:
bashecho $SHELL
1.3 Bash 的主要特点
- 强大的 命令行交互:组合、重定向、管道操作非常灵活。
- 支持 脚本编写 :可以编写
.sh
文件并运行。 - 易于与其他命令结合,具有丰富的内置功能。
2. 基本命令与文件操作
2.1 查看当前目录与切换目录
-
查看当前所在目录:
bashpwd
-
切换目录:
bashcd /path/to/directory
2.2 列出文件
-
列出文件和目录 (简洁列表):
bashls
-
查看详情(权限、大小、修改时间等):
bashls -l
-
显示隐藏文件:
bashls -a
2.3 创建、删除、复制、移动
-
创建文件 (空文件):
bashtouch filename
-
创建目录 :
bashmkdir directory_name
-
删除文件 :
bashrm filename
-
删除目录 :
bashrm -r directory_name
-
复制文件 :
bashcp source_file target_file
-
移动/重命名文件 :
bashmv old_name new_name
2.4 查看文件内容
-
cat :一次性显示整个文件
bashcat file.txt
-
less :分页查看文件(
q
退出)bashless file.txt
-
head/tail :只看开头/结尾 N 行
bashhead -n 10 file.txt tail -n 10 file.txt
-
tail -f file.txt:实时查看文件增长(常用于查看日志)
2.5 搜索文件
-
find :在指定路径下查找文件
bashfind /path -name "*.sh"
常与
xargs
或-exec
搭配使用做批量操作:bashfind /path -type f -name "*.log" -exec rm {} \;
3. 权限管理与用户管理
3.1 文件权限
-
Unix/Linux 的文件权限通常分为:所有者(user) 、组(group) 和 其他人(others) 三类。
-
每一类权限有三个维度:读(r) 、写(w) 、执行(x)。
-
查看权限:
bashls -l
例如:
-rwxr-xr--
表示所有者有 rwx 权限,组用户有 r-x 权限,其他人有 r-- 权限。
3.2 修改权限
-
使用
chmod
修改权限(符号模式或数字模式):bashchmod u=rwx,g=rx,o=r file.sh chmod 755 file.sh
3.3 修改文件拥有者
-
chown :修改文件/目录所有者或所属组
bashchown user file.txt chown user:group file.txt
3.4 切换用户
-
从当前用户切换到其他用户:
bashsu - other_user
-
使用超级管理员权限(若当前用户在 sudoers 列表中):
bashsudo command
4. 重定向与管道
4.1 标准输入输出和错误输出
- 文件描述符 :
stdin
:标准输入(文件描述符 0)stdout
:标准输出(文件描述符 1)stderr
:标准错误输出(文件描述符 2)
4.2 重定向
-
重定向输出到文件 (覆盖原文件):
bashcommand > file.txt
-
追加输出到文件 :
bashcommand >> file.txt
-
重定向错误输出 :
bashcommand 2> error.log command 2>> error.log
-
同时重定向标准输出和错误输出 :
bashcommand > all.log 2>&1
4.3 管道
-
管道操作符
|
:将左边命令的标准输出作为右边命令的标准输入。bashcommand1 | command2
常用示例:
bashls -l | grep ".sh"
4.4 Here Document 与 Here String
-
Here Document :将多个行的文本作为输入传递给命令
bashcat << EOF > file.txt line1 line2 EOF
EOF
可以改为任意标记,结束符前不能有多余空格。 -
Here String :将一小段字符串作为输入
bashgrep "pattern" <<< "this is a test"
5. 变量与环境变量
5.1 变量的定义与使用
-
定义变量 :
bashNAME="Alice" echo $NAME
-
注意 :等号两边不能有空格;要引用变量使用
echo $变量名
或${变量名}
。
5.2 环境变量
-
常见环境变量 :
$HOME
:用户主目录$PATH
:可执行文件搜索路径$PWD
:当前工作目录$SHELL
:当前 Shell 路径
-
导出环境变量 :
bashexport VARIABLE="value"
-
查看环境变量 :
bashenv printenv
5.3 位置参数变量
- 脚本中的位置参数 :
$0
:脚本自身的名字$1
~$9
:传递给脚本的参数$#
:传递给脚本的参数总个数$@
:传递给脚本的所有参数$?
:上一条命令的退出状态(0 表示成功,非 0 表示失败)
5.4 数组与关联数组(简单介绍)
-
普通数组 :
bashmyarr=(apple banana cherry) echo ${myarr[0]} # apple echo ${myarr[@]} # apple banana cherry
-
关联数组 (Bash 4+ 支持):
bashdeclare -A mymap mymap[color]="blue" mymap[fruit]="apple" echo ${mymap[color]} # blue
6. 通配符与正则表达式
6.1 通配符(Globbing)
*
:匹配任意长度的任意字符(包括空字符)?
:匹配单个任意字符[ ]
:匹配中括号内任意单个字符
例如ls *.sh
:匹配当前目录下所有以.sh
结尾的文件。
6.2 正则表达式(Regular Expressions)
- 通常结合
grep
、sed
、awk
等命令使用,用于复杂的文本匹配。 - 常见元字符:
^
:匹配行首$
:匹配行尾.
:匹配除换行符以外的任何字符*
:匹配前一个字符的 0 次或多次出现[...]
:匹配方括号内的任意一个字符( )
:分组
- 注意:通配符与正则表达式的语法/使用场景并不完全相同,需要区分。
7. Shell 脚本结构与控制流
7.1 脚本的基本结构
-
脚本头行(Shebang) :指定解释器
bash#!/usr/bin/env bash
-
注释 :使用
#
-
执行权限 :要让脚本具有可执行权限
bashchmod +x script.sh
-
运行脚本 :
bash./script.sh
或在当前 Shell 中执行:
bashsource script.sh # 或 . script.sh
7.2 条件判断
-
if 语句 :
bashif [ condition ]; then # ... elif [ condition2 ]; then # ... else # ... fi
-
test 命令 或者 单中括号
[ ]
:进行数值、字符串、文件检测,比如bash[ -f file ] # 是否是一个普通文件 [ -d directory ] # 是否是一个目录 [ "$VAR" = "abc" ] # 字符串是否相等 [ "$NUM" -eq 10 ] # 数值是否等于 10
-
双中括号 [[ ]]:Bash 的扩展测试语句,支持更多模式匹配等高级特性。
7.3 循环
-
for 循环 :
bashfor var in item1 item2 item3 do echo $var done
-
while 循环 :
bashwhile [ condition ] do # ... done
-
until 循环 :
bashuntil [ condition ] do # ... done
7.4 case 语句
bash
case $variable in
pattern1)
# ...
;;
pattern2)
# ...
;;
*)
# 默认匹配
;;
esac
7.5 常用扩展
-
命令替换 :
bashresult=$(command) # 或者老式用法: result=`command`
-
算术扩展 :
bashnum1=10 num2=5 echo $((num1 + num2)) # 15
-
花括号扩展 :
bashecho {1..5} # 1 2 3 4 5 echo file{A,B,C}.txt # fileA.txt fileB.txt fileC.txt
8. 常用内建命令与技巧
8.1 type/which
-
查看命令是内置(builtin)还是外部可执行文件:
bashtype cd type ls
-
查看可执行文件路径:
bashwhich ls
8.2 history
-
查看和管理历史命令:
bashhistory
-
执行第 N 条历史命令:
bash!N
-
搜索历史:按
Ctrl + r
,然后输入关键字
8.3 echo/printf
echo
:输出文本,自动换行printf
:功能类似 C 语言的printf
,可格式化输出
8.4 read
-
交互式读取用户输入:
bashread -p "Enter your name: " NAME echo "Hello, $NAME"
-
read
常用选项:-r
:禁止反斜杠转义-t <秒>
:设置等待输入的超时时间
8.5 引号与转义
- 单引号
' '
:原样输出,引号内所有字符都被视为普通字符 - 双引号
" "
:可以进行变量替换和命令替换 - 反斜杠
\
:转义下一字符
9. 文本处理常用命令
9.1 grep
-
在文本中搜索匹配的行:
bashgrep "pattern" file.txt
-
结合正则表达式:
bashgrep -E "reg(pattern)+" file.txt
-
常用选项:
-i
:忽略大小写-n
:显示行号-v
:显示不匹配的行
9.2 sed
-
流编辑器 ,可进行文本替换、插入、删除等:
bashsed 's/old/new/g' file.txt
-
-i
选项可以直接修改文件:bashsed -i 's/old/new/g' file.txt
9.3 awk
-
强大的文本处理工具,可按列进行分析:
bashawk '{print $1, $3}' file.txt
-
支持复杂脚本逻辑,可以根据分隔符处理 CSV 等格式。关键字段:
$0
:当前行全部内容$1
:第一列 ...$NF
:最后一列NR
:当前行号FS
:输入分隔符
9.4 sort、uniq、cut、paste、xargs、tee
-
sort :排序
bashsort file.txt
-
uniq :去重(需先 sort)
bashsort file.txt | uniq
-
cut :切割某几列
bashcut -d ',' -f 1,3 file.csv
-
paste:将多文件按行合并
-
xargs :将标准输入的输出拼接成命令参数
bashfind . -name "*.txt" | xargs rm
-
tee :将输入同时写入文件和标准输出
bashcommand | tee output.txt
10. 作业控制与进程管理
10.1 后台运行
-
在命令末尾加
&
,使其在后台运行:bashlong_running_command &
-
查看后台作业:
bashjobs
10.2 前后台切换
- 暂停前台作业 :
Ctrl + Z
- 将暂停的作业放到后台 :
bg %job_number
- 恢复后台作业到前台 :
fg %job_number
10.3 进程管理
-
ps :列出当前进程
bashps aux
-
top/htop:动态查看进程状态
-
kill :结束进程
bashkill -9 PID
11. 别名与函数
11.1 别名(alias)
-
临时设置别名:
bashalias ll='ls -l'
-
在
~/.bashrc
中设置长期别名,加入:bashalias ll='ls -l --color=auto'
11.2 函数(function)
-
在脚本或命令行定义函数:
bashmyfunc() { echo "This is my function." }
-
调用函数:
bashmyfunc
-
在函数内使用局部变量可用
local
关键字:bashmyfunc() { local var="local_value" echo "$var" }
12. 实用技巧与注意事项
- Tab 补全 :在命令行输入部分命令或文件名后按
Tab
可自动补全。 - 通配符谨慎使用 :如
rm -rf *
;需非常小心,以防误删重要文件。 - Shell 脚本调试 :
bash -x script.sh
:打印执行过程(追踪每一条命令)bash -n script.sh
:只做语法检查,不执行脚本- 在脚本顶部加入
set -x
或手动添加set -e
、set -u
、set -o pipefail
等,以控制脚本在出错或使用未定义变量时及时退出。
- 查看命令帮助 :
- 内部命令使用
help command
- 外部命令使用
command --help
或man command
- 内部命令使用
- PS1 自定义 :在
~/.bashrc
中可自定义 PS1 来定制命令行提示符(颜色、显示 Git 分支等)。 - 区分登录 Shell 与非登录 Shell :常见的启动文件有
.bash_profile
、.bashrc
、.profile
等,具体加载顺序略有差异。 - 使用
shellcheck
:对脚本做静态分析,排查常见错误和风格问题。
13. 更多 Bash 进阶话题
以下内容更偏进阶或对复杂场景十分有用,可在掌握基础后逐步学习:
- 定时任务 :使用
cron
(编辑crontab -e
)或at
命令进行定时或一次性任务调度。 - 函数库与脚本组织 :将常用函数抽取为脚本,使用
source
(或.
) 引用。 - shopt 与 Shell 选项 :比如
shopt -s expand_aliases
等,可开启或关闭 Bash 的一些特性。 - 信号处理(trap) :在脚本里捕获
SIGINT
(Ctrl+C) 等信号并做相应处理。 - 正则高级用法 :POSIX ERE 与 PCRE 的差异、利用
grep -P
等。 - 多进程/并发:用子 Shell、GNU Parallel 等方式提升脚本并发能力。