Bash 基础与进阶实践指南
目录
- Bash 简介与基础
- 基本命令与文件操作
- 权限管理与用户管理
- 重定向与管道
- 变量与环境变量
- 通配符与正则表达式
- Shell 脚本结构与控制流
- 常用内建命令与技巧
- 文本处理常用命令
- 作业控制与进程管理
- 别名与函数
- 实用技巧与注意事项
- 更多 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:
echo $SHELL
1.3 Bash 的主要特点
- 强大的 命令行交互:组合、重定向、管道操作非常灵活。
- 支持 脚本编写:可以编写
.sh
文件并运行。 - 易于与其他命令结合,具有丰富的内置功能。
2. 基本命令与文件操作
2.1 查看当前目录与切换目录
- 查看当前所在目录:
pwd
- 切换目录:
cd /path/to/directory
2.2 列出文件
- 列出文件和目录(简洁列表):
ls
- 查看详情(权限、大小、修改时间等):
ls -l
- 显示隐藏文件:
ls -a
2.3 创建、删除、复制、移动
- 创建文件(空文件):
touch filename
- 创建目录:
mkdir directory_name
- 删除文件:
rm filename
- 删除目录:
rm -r directory_name
- 复制文件:
cp source_file target_file
- 移动/重命名文件:
mv old_name new_name
2.4 查看文件内容
- cat:一次性显示整个文件
cat file.txt
- less:分页查看文件(
q
退出)less file.txt
- head/tail:只看开头/结尾 N 行
head -n 10 file.txt tail -n 10 file.txt
- tail -f file.txt:实时查看文件增长(常用于查看日志)
2.5 搜索文件
- find:在指定路径下查找文件
常与find /path -name "*.sh"
xargs
或-exec
搭配使用做批量操作:find /path -type f -name "*.log" -exec rm {} \;
3. 权限管理与用户管理
3.1 文件权限
- Unix/Linux 的文件权限通常分为:所有者(user)、组(group) 和 其他人(others) 三类。
- 每一类权限有三个维度:读(r)、写(w)、执行(x)。
- 查看权限:
例如:ls -l
-rwxr-xr--
表示所有者有 rwx 权限,组用户有 r-x 权限,其他人有 r-- 权限。
3.2 修改权限
- 使用
chmod
修改权限(符号模式或数字模式):chmod u=rwx,g=rx,o=r file.sh chmod 755 file.sh
3.3 修改文件拥有者
- chown:修改文件/目录所有者或所属组
chown user file.txt chown user:group file.txt
3.4 切换用户
- 从当前用户切换到其他用户:
su - other_user
- 使用超级管理员权限(若当前用户在 sudoers 列表中):
sudo command
4. 重定向与管道
4.1 标准输入输出和错误输出
- 文件描述符:
stdin
:标准输入(文件描述符 0)stdout
:标准输出(文件描述符 1)stderr
:标准错误输出(文件描述符 2)
4.2 重定向
- 重定向输出到文件(覆盖原文件):
command > file.txt
- 追加输出到文件:
command >> file.txt
- 重定向错误输出:
command 2> error.log command 2>> error.log
- 同时重定向标准输出和错误输出:
command > all.log 2>&1
4.3 管道
- 管道操作符
|
:将左边命令的标准输出作为右边命令的标准输入。
常用示例:command1 | command2
ls -l | grep ".sh"
4.4 Here Document 与 Here String
- Here Document:将多个行的文本作为输入传递给命令
cat << EOF > file.txt line1 line2 EOF
EOF
可以改为任意标记,结束符前不能有多余空格。 - Here String:将一小段字符串作为输入
grep "pattern" <<< "this is a test"
5. 变量与环境变量
5.1 变量的定义与使用
- 定义变量:
NAME="Alice" echo $NAME
- 注意:等号两边不能有空格;要引用变量使用
echo $变量名
或${变量名}
。
5.2 环境变量
- 常见环境变量:
$HOME
:用户主目录$PATH
:可执行文件搜索路径$PWD
:当前工作目录$SHELL
:当前 Shell 路径
- 导出环境变量:
export VARIABLE="value"
- 查看环境变量:
env printenv
5.3 位置参数变量
- 脚本中的位置参数:
$0
:脚本自身的名字$1
~$9
:传递给脚本的参数$#
:传递给脚本的参数总个数$@
:传递给脚本的所有参数$?
:上一条命令的退出状态(0 表示成功,非 0 表示失败)
5.4 数组与关联数组(简单介绍)
- 普通数组:
myarr=(apple banana cherry) echo ${myarr[0]} # apple echo ${myarr[@]} # apple banana cherry
- 关联数组(Bash 4+ 支持):
declare -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):指定解释器
#!/usr/bin/env bash
- 注释:使用
#
- 执行权限:要让脚本具有可执行权限
chmod +x script.sh
- 运行脚本:
或在当前 Shell 中执行:./script.sh
source script.sh # 或 . script.sh
7.2 条件判断
- if 语句:
if [ condition ]; then # ... elif [ condition2 ]; then # ... else # ... fi
- test 命令 或者 单中括号
[ ]
:进行数值、字符串、文件检测,比如[ -f file ] # 是否是一个普通文件 [ -d directory ] # 是否是一个目录 [ "$VAR" = "abc" ] # 字符串是否相等 [ "$NUM" -eq 10 ] # 数值是否等于 10
- 双中括号 [[ ]]:Bash 的扩展测试语句,支持更多模式匹配等高级特性。
7.3 循环
- for 循环:
for var in item1 item2 item3 do echo $var done
- while 循环:
while [ condition ] do # ... done
- until 循环:
until [ condition ] do # ... done
7.4 case 语句
case $variable in
pattern1)
# ...
;;
pattern2)
# ...
;;
*)
# 默认匹配
;;
esac
7.5 常用扩展
- 命令替换:
result=$(command) # 或者老式用法: result=`command`
- 算术扩展:
num1=10 num2=5 echo $((num1 + num2)) # 15
- 花括号扩展:
echo {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)还是外部可执行文件:
type cd type ls
- 查看可执行文件路径:
which ls
8.2 history
- 查看和管理历史命令:
history
- 执行第 N 条历史命令:
!N
- 搜索历史:按
Ctrl + r
,然后输入关键字
8.3 echo/printf
echo
:输出文本,自动换行printf
:功能类似 C 语言的printf
,可格式化输出
8.4 read
- 交互式读取用户输入:
read -p "Enter your name: " NAME echo "Hello, $NAME"
read
常用选项:-r
:禁止反斜杠转义-t <秒>
:设置等待输入的超时时间
8.5 引号与转义
- 单引号
' '
:原样输出,引号内所有字符都被视为普通字符 - 双引号
" "
:可以进行变量替换和命令替换 - 反斜杠
\
:转义下一字符
9. 文本处理常用命令
9.1 grep
- 在文本中搜索匹配的行:
grep "pattern" file.txt
- 结合正则表达式:
grep -E "reg(pattern)+" file.txt
- 常用选项:
-i
:忽略大小写-n
:显示行号-v
:显示不匹配的行
9.2 sed
- 流编辑器,可进行文本替换、插入、删除等:
sed 's/old/new/g' file.txt
-i
选项可以直接修改文件:sed -i 's/old/new/g' file.txt
9.3 awk
- 强大的文本处理工具,可按列进行分析:
awk '{print $1, $3}' file.txt
- 支持复杂脚本逻辑,可以根据分隔符处理 CSV 等格式。关键字段:
$0
:当前行全部内容$1
:第一列 …$NF
:最后一列NR
:当前行号FS
:输入分隔符
9.4 sort、uniq、cut、paste、xargs、tee
- sort:排序
sort file.txt
- uniq:去重(需先 sort)
sort file.txt | uniq
- cut:切割某几列
cut -d ',' -f 1,3 file.csv
- paste:将多文件按行合并
- xargs:将标准输入的输出拼接成命令参数
find . -name "*.txt" | xargs rm
- tee:将输入同时写入文件和标准输出
command | tee output.txt
10. 作业控制与进程管理
10.1 后台运行
- 在命令末尾加
&
,使其在后台运行:long_running_command &
- 查看后台作业:
jobs
10.2 前后台切换
- 暂停前台作业:
Ctrl + Z
- 将暂停的作业放到后台:
bg %job_number
- 恢复后台作业到前台:
fg %job_number
10.3 进程管理
- ps:列出当前进程
ps aux
- top/htop:动态查看进程状态
- kill:结束进程
kill -9 PID
11. 别名与函数
11.1 别名(alias)
- 临时设置别名:
alias ll='ls -l'
- 在
~/.bashrc
中设置长期别名,加入:alias ll='ls -l --color=auto'
11.2 函数(function)
- 在脚本或命令行定义函数:
myfunc() { echo "This is my function." }
- 调用函数:
myfunc
- 在函数内使用局部变量可用
local
关键字:myfunc() { 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 等方式提升脚本并发能力。
14. 参考资源
- GNU Bash 官方文档
- The Linux Documentation Project (TLDP)
- Bash Scripting Tutorial (ABS Guide)
- shellcheck - Shell 脚本静态分析工具