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 doecho $var done
- while 循环:
while [ condition ] do# ... done
- until 循环:
until [ condition ] do# ... done
7.4 case 语句
case $variable inpattern1)# ...;;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 脚本静态分析工具
相关文章:
Bash 基础与进阶实践指南
目录 Bash 简介与基础基本命令与文件操作权限管理与用户管理重定向与管道变量与环境变量通配符与正则表达式Shell 脚本结构与控制流常用内建命令与技巧文本处理常用命令作业控制与进程管理别名与函数实用技巧与注意事项更多 Bash 进阶话题参考资源 1. Bash 简介与基础 1.1 什…...

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序视角下的个人IP人设构建研究
摘要:本文深入探讨在开源AI智能名片2 1链动模式S2B2C商城小程序的应用场景下,个人IP人设构建的理论与实践。通过剖析个人IP人设定义中的“诉求”“特质”“可感知”三要素,结合该小程序特点,阐述其对个人IP打造的影响与推动作用&…...

基于springboot+vue的航空散货调度系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

【C++】B2122 单词翻转
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 💯一、我的做法代码实现:代码解析思路分析 💯二、老师的第一种做法代码实现&a…...
OSCP 渗透测试:网络抓包工具的使用指南
在 OSCP 考试和渗透测试中,网络数据分析是至关重要的技能。无论是嗅探明文密码、分析恶意流量,还是溯源攻击,抓包工具都是我们的得力助手。 本文将介绍 OSI 七层网络模型 及其在网络分析中的作用,并详细讲解 Wireshark 和 tcpdum…...

Android 进程间通信
什么是IPC? Android 进程间通信(IPC,Inter-Process Communication)是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统,每个应用通常运行在自己的进程中,以提高安全性和…...

Kubernetes学习之通过Service访问Pod
一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址,当controller用新的pod替代发生故障的pod时,新的pod会分配到新的ip地址,那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象
2.18 对象数组:在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…...
Web - CSS3基础语法与盒模型
概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性,如段落和行相关属性、字体文本属性。最后阐述了盒子模型,如元素隐藏、行内与块元素转换、…...

CSS知识总结
CSS(层叠样式表,Cascading Style Sheets)是一种用于描述网页内容视觉表现的样式语言,与HTML(结构)和JavaScript(行为)共同构成现代Web开发的三大核心技术。 一、基本概念 定义&…...

基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token
之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…...
信息学奥赛一本通 2113:【24CSPJ普及组】小木棍(sticks) | 洛谷 P11229 [CSP-J 2024] 小木棍
【题目链接】 ybt 2113:【24CSPJ普及组】小木棍(sticks) 洛谷 P11229 [CSP-J 2024] 小木棍 【题目考点】 1. 思维题,找规律 【解题思路】 解法1:找规律 该题为:求n根木棍组成的无前导0的所有可能的数…...

安装hami的笔记
k3s环境下安装hami提示如下错误: "failed to “StartContainer” for “kube-scheduler” with InvalidImageName: "Failed to apply default image tag “registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.2k3s1”: 没有Inva…...

【区块链】区块链密码学基础
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 区块链密码学基础引言一、哈希函数1.1 基本概念1.2 数学表达 二、非对称加密2.1…...

强化学习笔记(5)——PPO
PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下,函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下,f(x)*p(x)/q(x) 的期望。 起因是:求最大化回报的期望,所以对ceta求梯度 具体举例…...

【C语言入门】解锁核心关键字的终极奥秘与实战应用(三)
目录 一、auto 1.1. 作用 1.2. 特性 1.3. 代码示例 二、register 2.1. 作用 2.2. 特性 2.3. 代码示例 三、static 3.1. 修饰局部变量 3.2. 修饰全局变量 3.3. 修饰函数 四、extern 4.1. 作用 4.2. 特性 4.3. 代码示例 五、volatile 5.1. 作用 5.2. 代码示例…...
寒假day10
第十天:请写出以下几个数据的类型 整数 a int a的地址 int* 存放a的数组b …...

本地部署与使用SenseVoice语音大模型简析
前言 SenseVoice 是一种语音基础模型,具有多种语音理解功能,包括自动语音识别 (ASR)、口语识别 (LID)、语音情感识别 (SER) 和音频事件检测 (AED)。本博客将指导您安装和使用 SenseVoice 模型,使其尽可能方便用户使用。 Github 仓库链接: ht…...
Kafka SASL/SCRAM介绍
文章目录 Kafka SASL/SCRAM介绍1. SASL/SCRAM 认证机制2. SASL/SCRAM 认证工作原理2.1 SCRAM 认证原理2.1.1 密码存储和加盐2.1.2 SCRAM 认证流程 2.2 SCRAM 认证的关键算法2.3 SCRAM 密码存储2.4 SCRAM 密码管理 3. 配置和使用 Kafka SASL/SCRAM3.1 Kafka 服务器端配置3.2 创建…...

中间件漏洞之CVE-2024-53677
目录 什么是struts?CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts? 在早期的 Java Web 开发中,代码往往混乱不堪,难以维护和扩展。比如,一个简单的用户登录功能,可能在不同的 Java 类…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...