当前位置: 首页 > news >正文

3.2 > Bash

概览

在上一节中我们了解了关于 Shell 的执行流程,知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中,将会学习到 Linux 中最常见的一个 Shell —— Bash,了解到 bash 的相关知识和用法。

本节目录

    • 概览
    • 相关知识
      • bash 命令提示符
      • bash 基本格式
    • bash 常用特殊符号
        • 特殊字符:
        • 通配符:
        • 逻辑运算符:
        • 重定向符:
        • 命令替换符:
        • 变量和环境符:
        • 引号符:
        • 其他符号:
    • bash 有哪些常用配置文件
        • 可能常用的系统级配置文件:
        • 可能常用的用户级配置文件:
        • bash 的配置文件加载顺序:
    • bash 内建命令
      • 几个常用的内建命令

相关知识

在上一节中说到,bash 是 sh 的拓展集,除开一些特殊情况,它差不多完全兼容 sh,所以说 bash 也是众多 Linux 发行版中默认使用最多的 Shell。

bash 命令提示符

[iris@localhost ~]$
  • iris:登录到当前终端的用户名称。
  • localhost:当前计算机的主机名称。
  • ~:当前用户所在的目录,在此处表示的是用户所在的家目录。
  • $:当前用户的级别,在此处表示当前用户为普通用户,# 表示超级用户。

在非特殊情况下,我们并不推荐你使用超级用户来管理你的计算机,必要情况下可以使用 sudo 来暂时切换到超级用户权限来管理计算机,这将会在后面说到。

bash 基本格式

[iris@localhost ~]$ 命令 [OP] [ARG]
  • 命令:指定要执行的操作。例如:ls、cd、echo 等。
  • OP:命令选项,用于修改命令的行为,通常以单个短划线(-)或双短划线(–)开头;如 ls -l 或 ls --all。
  • ARG:命令需要操作的对象,例如文件或目录名称;如 ls -l /usr。

bash 常用特殊符号

所有的特殊符号在后面的所有章节中都会提到

特殊字符:
符号含义示例
\转义字符,用于转义特殊字符echo $HOME
#注释符,一般用于在bash 脚本中注释文字# this is note
~主目录符,表示当前用户家目录ls ~
.一个点表示当前目录ls .
两个点表示上一级目录cd …
-表示上一次所在的目录cd -
&将命令置于后台运行sleep 5 &
通配符:
符号含义示例
*匹配 >= 0 个的任意字符ls *.txt
匹配任意 1 个字符ls file?.txt
+匹配任意字符至少 1 个echo “abc123” | grep -E “[a-z]+”
[ ]匹配括号中的任意一个字符或者一个范围。如 [a-z] 匹配所有小写字母;[2,e,4] 只能匹配 2、e、4 三个字符;可以与符号 ! 联合使用,[!0-9] 匹配除数字之外的任意字符ls file[1-3].txt 匹配以 1、2、3任意一个字符结尾的 txt 文件
{ }扩展或者枚举括号中每一个字符ls -l {a,c,d} 只查看括号中规定的目录
逻辑运算符:
符号含义示例
&&逻辑与,前一个命令成功后执行后一个命令,不会忽略返回值,成功True、失败Falsemkdir test && cd test
||逻辑或,无论前一个命令是否成功,不会忽略返回值cat txt || touch txt
!用于执行历史中的命令;也是逻辑非运算! 3 ,执行 history 中的第三条命令
顺序执行,无论前一个命令是否成功,会忽略返回值mkdir test; cd test
重定向符:
符号含义示例
>输出重定向,将覆盖文件echo “Hello” > file.txt
>>输出重定向,追加内容到文件echo “Hello” >> file.txt
<输入重定向,从文件中读取wc -l < file.txt
2>错误输出重定向到文件ls /invalid-dir 2> error.log
&>标准输出和错误输出同时重定向到文件command &> output.txt
<<Here Document,用于多行输入cat << EOF
|管道符,将前一命令的输出作为后一命令的输入cat file.txt | grep Hello
命令替换符:
符号含义示例
` `使用反引号执行命令并返回结果echo `date`
$(cmd)与反引号功能相同,但更推荐使用echo $(date)
变量和环境符:
符号含义示例
$引用变量值echo $HOME
${}用于更复杂的变量操作或避免歧义echo ${USER}
$n获取命令行传递的第 n 个参数,第 0 个参数为命令本身echo $1
$@获取所有参数,将每个参数视为一个独立单元echo $@
$*获取所有参数,将所有参数视为一个整体,当作一个字符串echo $*
$#脚本中传递的参数总个数echo $#
$?获取上一个命令的退出状态码echo $?
$$当前进程的 PIDecho $$
$!最近运行的后台任务的 PIDecho $!

更多与 bash shell 编程有关的符号将在后面陆续说到

引号符:
符号含义示例
单引号,原样输出,变量和特殊字符无效echo ‘$HOME’
"双引号,支持变量替换和转义字符echo “Home: $HOME”
`引号,命令替换echo date
其他符号:
符号含义示例
()分组,用于控制命令优先级;用于运算(cd /tmp && ls)
空操作,始终返回成功
!!执行上一条命令!!
!*获取上一条命令的所有参数!*

还有众多作者未曾使用过的特殊符号,欢迎有人在评论区指正

bash 有哪些常用配置文件

可能常用的系统级配置文件:
  • /etc/profile:是系统级的环境变量和启动配置文件,它适用于所有用户的登录 Shell 会话(仅适用于登录 shell)。它在用户登录时被执行,一般用它来设置全局环境变量或者执行其他全局脚本文件。
  • /etc/profile.d/:额外的环境变量或启动脚本,所有用户生效。
  • /etc/bashrc 或 /etc/bash.bashrc:是系统级的 Bash 配置文件,用于为所有用户的非登录 Shell 提供全局配置。
  • /etc/bash_completion.d: Bash 自动补全(tab 补全) 的扩展目录,存放特定命令的补全脚本。当启用了 Bash 补全功能时,该目录下的脚本会自动加载,并为对应的命令提供 Tab 键补全。(通常可以安装 bash-completion 工具包或手动添加补全脚本)。关于此用法将在文章最后的附录部分进行介绍。
  • /etc/skel/:是 Linux 系统中的“用户模板目录”,用于存放新用户的默认配置文件。当创建新用户时(使用 useradd 命令),系统会自动复制 skel 目录中的所有文件到新用户的 home 目录。也用于初始化新用户的 Shell 环境,避免每次创建用户都手动配置 .bashrc、.profile 等。
可能常用的用户级配置文件:
  • ~/.bashrc:非登录 Shell 配置。
  • ~/.bash_profile:登录 Shell 配置。
  • ~/.profile:兼容 sh 脚本的用户级登录 Shell 配置。
  • ~/.bash_logout:登出Bash 会话时执行。

注意:这些配置文件会随时随着系统版本的变化而变化,但大致作用不会做出大的改变。(如 ~/.profile 在最新的 RHEL9 中就默认不存在,但是如果手动创建它,那它将仍然是一个有效的配置文件)

bash 的配置文件加载顺序:
  • 对于登录 shell 的加载顺序:
    • 加载全局配置:/etc/profile、/etc/profile.d/*.sh(由 /etc/profile 加载)
    • 加载用户级配置:~/.bash_profile:
      • 若 ~/.bash_profile 文件不存在:尝试加载 ~/.bash_login:
        • 若 ~/.bash_login 也不存在,则加载 ~/.profile
    • 若 ~/.bash_profile 里有 source ~/.bashrc,则继续加载 ~/.bashrc
    • 登出时加载:~/.bash_logout
  • 对于非登录 shell 的加载顺序:
    • 加载系统级配置文件:/etc/bashrc(RHEL系列);/etc/bash.bashrc (Debian/Ubuntu等系列)
    • 加载用户级配置文件:~/.bashrc

bash 内建命令

bash 内建命令是 bash 自带的命令,它们不依赖于 /usr/bin/ 或其他外部程序,因此执行速度更快,并且即使 /usr/bin/ 不可用,它们仍然可以运行。

[root@localhost ~]# type logout			# 查看单个命令是不是 bash 内建命令,type本身也是内建命令
logout 是 shell 内建
[root@localhost ~]# compgen -b			# 查看 bash 包含的所有内建命令,或使用 help 查看所有内建命令及其语法
.
:
alias
bg
...

几个常用的内建命令

内建命令 cd:

[root@localhost ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg
[root@localhost ~]# cd /usr				# 去往各个目录
[root@localhost usr]# ls
bin  games  include  lib  lib64  libexec  local  sbin  share  src  tmp

内建命令 history、fc:

[root@localhost ~]# history 			# 显示所有历史执行过的命令1  ip a2  ping baidu.com....117  ls118  history 
[root@localhost ~]# fc 117		# 编辑并重新执行对应编号的历史命令,将 ls 重新编辑为 ls -l 执行。(!117 只是执行对应编号的命令)
ls -l
总用量 8
-rw-r--r--. 1 root root   2  212 13:00 1
drwxr-xr-x. 2 root root   6  118 10:47 公共

内建命令 alias、unalias:

[root@localhost ~]# la
bash: la: command not found...
[root@localhost ~]# alias la="ls -a"		# 给一些命令设置临时别名,也可以写入.bashrc等预加载脚本中永久生效
[root@localhost ~]# la
.   公共  视频  文档  音乐  anaconda-ks.cfg  .bash_logout   .bashrc  .config  .local    .tcshrc
..  模板  图片  下载  桌面  .bash_history    .bash_profile  .cache   .cshrc   .mozilla
[root@localhost ~]# unalias la				# 反过来也可以去取消别名
[root@localhost ~]# la
bash: la: command not found...

内建命令 logout、exit:

[root@localhost ~]# logout 			# 退出登录 Shell(适用于 SSH 或终端)SSH  192.168.0.100: session closed
按任意键重新连接
[root@localhost ~]# exit 			# 退出当前 Shell,并返回退出代码

内建命令dirs、pwd:

[root@localhost ~]# cd /usr/share/
[root@localhost share]# dirs		# 显示当前目录栈
/usr/share
[root@localhost share]# pwd			# 一样的功能
/usr/share

内建命令 jobs、fg、bg:

[root@localhost share]# sleep 100 &
[1] 2704
[root@localhost share]# jobs			# 查看所有后台作业
[1]+  运行中               sleep 100 &
[root@localhost share]# fg				# 将后台作业调度到前台执行
sleep 100
[root@localhost share]# bg				# 将后台已暂停的作业恢复到后台执行

内建命令 disown、kill:

[root@localhost ~]# sleep 1000 &
[1] 2720
[root@localhost ~]# jobs
[1]+  运行中               sleep 1000 &
[root@localhost ~]# disown 			# 让已经存在的任务脱离当前终端运行,当关闭终端时,此任务将不会受到任何影响
[root@localhost ~]# jobs
[root@localhost ~]# 
[root@localhost ~]# ps aux | grep sleep		# 任务已脱离终端运行
root        2720  0.0  0.0 220956  1024 pts/0    S    12:50   0:00 sleep 1000
root        2724  0.0  0.0 221684  2484 pts/0    S+   12:52   0:00 grep --color=auto sleep
[root@localhost ~]# kill -9 2720		# 杀死任务id为 2720 的任务
[root@localhost ~]# ps aux | grep sleep
root        2727  0.0  0.0 221684  2428 pts/0    S+   12:55   0:00 grep --color=auto sleep

其他常用内建命令将在 shell 编程中提到

相关文章:

3.2 > Bash

概览 在上一节中我们了解了关于 Shell 的执行流程&#xff0c;知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中&#xff0c;将会学习到 Linux 中最常见的一个 Shell —— Bash&#xff0c;了解到 bash 的相关知识和用法。 本节目录 概览相关知识bash 命令提示符bas…...

排序合集(一)

一、直接插入排序 (Insertion Sort) 基本思想 直接插入排序是一种简单直观的排序算法&#xff0c;就像我们打扑克牌时的操作&#xff1a;每次摸到一张牌&#xff0c;都会把它插入到手中已排好序的牌的正确位置。通过这种方式&#xff0c;逐步构建一个有序序列。 步骤 从第一…...

Spring:Spring实现AOP的通俗理解(有源码跟踪)

目录标题 AOP定义SpringAOP和AspectJ联系Spring如何实现AOPAOP的代理对象AOP的代理对象生成过程 AOP定义 AOP &#xff08;Aspect Orient Programming&#xff09;&#xff1a;直译过来就是 面向切面编程。AOP 是一种编程思想用途&#xff1a;Transactions &#xff08;事务调…...

通过openresty和lua实现随机壁纸

效果&#xff1a; 图片存放路径&#xff1a; /home/jobs/webs/imgs/ ├── default/ │ ├── image1.jpg │ ├── image2.png ├── cats/ │ ├── cat1.jpg │ ├── cat2.gif ├── dogs/ │ ├── dog1.jpg访问http://demo.com/imgs/default 随机返回…...

Day 36 卡玛笔记

这是基于代码随想录的每日打卡 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1…...

【Elasticsearch】match查询

Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值&#xff0c;并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析&#xff0c;包括其工作原理、参数配置和使用场景。 1.match查询的…...

MATLAB 生成脉冲序列 pulstran函数使用详解

MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列&#xff0c;支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加&#xff0c;生成脉冲序列&#xff0c;适用于信号处理和系统…...

开源、免费项目管理工具比较:2025最新整理30款

好用的开源、免费版项目管理系统有&#xff1a;1.Redmine&#xff1b;2. Taiga&#xff1b;3. OpenProject&#xff1b; 4.ProjectLibre&#xff1b; 5.GanttProject&#xff1b; 6.Tuleap&#xff1b; 7.Trac&#xff1b;8. Phabricator&#xff1b; 9.Notion&#xff1b; 10.…...

ffmpeg -muxers

1. ffmpeg -muxers -loglevel quiet 显示ffmpeg支持的复用器。复用器的作用是将多个独立的媒体流&#xff08;如视频流、音频流、字幕流等&#xff09;按照一定的格式和规则组合成一个单一的复合流&#xff1b;解复用器的作用与复用器相反&#xff0c;它将复合流分解为多个独立…...

设置mysql的主从复制模式

mysql设置主从复制模式似乎很容易&#xff0c;关键在于1&#xff09;主库启用二进制日志&#xff0c;2&#xff09;从库将主库设为主库。另外&#xff0c;主从复制&#xff0c;复制些什么&#xff1f;从我现在获得的还很少的经验来看&#xff0c;复制的内容有表&#xff0c;用户…...

ASP.NET Core的贫血模型与充血模型

目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型&#xff1a;一个类中只有属性或者成员变量&#xff0c;没有方法。充血模型&#xff1a;一个类中既有属性、成员变量&#xff0c;也有方法。 需求 定义一个类保存用户的用户名、密码、积分&#xff1b;用户必须具有…...

君海游戏岗位,需要私我

游戏岗位内推啦&#xff0c;需要找我哈 共14个职位 广告投放主管 社会招聘全国 广告投放 社会招聘全国 设计主管 社会招聘全国 海外投放 社会招聘广东省广州市 海外运营 社会招聘广东省广州市 产品运营专员 社会招聘广东省广州市 平台运营 社会招聘广东…...

IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统

案例:刀箱某一blade,例如 blade 5 安装 Hyper-V Server 2019 操作系统(安装进硬盘) 刀箱USB插入安装系统U盘,登录192.168... IBM BlandeCenter Restart Blande 5,如果Restart 没反应,那就 Power Off Blade 然后再 Power On 重启后进入BIOS界面设置usb存储为开机启动项 …...

Unity中实现动态图集算法

在 Unity 中&#xff0c;动态图集&#xff08;Dynamic Atlas&#xff09;是一种在运行时将多个纹理合并成一个大纹理图集的技术&#xff0c;这样可以减少渲染时的纹理切换次数&#xff0c;提高渲染效率。 实现原理&#xff1a; 动态图集的核心思想是在运行时动态地将多个小纹理…...

MySQL中的覆盖索引的使用

文章目录 1. 覆盖索引的定义2. 覆盖索引的工作原理2.1 索引和回表2.2 如何实现覆盖索引 3. 覆盖索引的优势4. 覆盖索引的限制5. 创建和优化覆盖索引5.1 分析查询模式5.2 确定需要覆盖的列5.3 创建复合索引5.4 使用覆盖索引优化查询5.5 避免过度索引5.6 索引整理与优化 6. 实际应…...

XML DOM

XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …...

[开源]MaxKb+Ollama 构建RAG私有化知识库

MaxKbOllama&#xff0c;基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb&#xff1f;二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试

将编译好的镜像全部进行烧写&#xff0c;镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后&#xff0c;在调试串口查看打印日志&#xff0c;如下图所示&#xff1a; 然后打开 hdc 工具&#xff0c;运行测试程序&#xff0c;输入“led_test 1”&…...

将Mac上Python程序的虚拟环境搬到Windows

1. 导出Mac上Python虚拟环境的依赖 cd py && source venv/bin/activate && pip freeze > requirements.txt 2. 在Windows上创建一个新的虚拟环境 python -m venv venv 3. 激活虚拟环境 venv\Scripts\activate 4. 安装依赖 pip install -r requiremen…...

大语言模型评价 怎么实现去偏见处理

大语言模型评价 怎么实现去偏见处理 在训练大语言模型(LLMs)时,去偏处理对于避免模型学习到带有偏见的模式至关重要,以下从数据处理、模型训练、评估监测三个阶段介绍具体实现方法,并结合招聘场景进行举例说明: 数据处理阶段 数据清洗:仔细审查并剔除包含明显偏见的训练…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...