Bash Shell 基础操作全面指南

在 Linux 系统管理和自动化运维领域,Bash Shell 作为最常用的命令行解释器,是每个技术人员必须掌握的核心技能。无论是系统管理、脚本编写还是日常运维,Bash Shell 都扮演着至关重要的角色。本文将全面介绍 Bash Shell 的基础操作,涵盖变量使用、命令执行方式、系统管理命令以及 Vim 编辑器使用等核心内容,帮助读者快速掌握 Linux 系统的基础操作技能。

一、Bash Shell 基础概念与环境配置

1.1 什么是 Bash Shell

**Bash(Bourne Again Shell)** 是目前 Unix 和 Linux 系统中最广泛使用的命令行解释器,也是绝大多数 Linux 发行版的默认 Shell​。Shell 这个词源于 "外壳" 的概念,相对于操作系统的内核(kernel)而言,它构成了用户与系统交互的外层接口​。​

从技术层面理解,Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质​。Shell 程序本身的功能相对较弱,比如文件操作、输入输出、进程管理等都需要依赖内核提供的接口函数来实现​。​

在 Linux 系统的发展历程中,出现了多种不同的 Shell 实现,包括 Bourne Shell(sh)、C Shell(csh)、Korn Shell(ksh)、Z Shell(zsh)等,每种都有其特点和优势。而 Bash 是 GNU 计划的自由软件,兼容经典 Bourne Shell(sh),并在其基础上扩展了交互与脚本功能,成为 Linux 和 macOS 的默认 Shell​。

1.2 查看和确认 Bash 版本

在开始学习 Bash 之前,了解当前系统的 Bash 版本是很重要的。可以通过以下几种方法来查看 Bash 版本:

方法一:使用 bash --version 命令

这是最直接的方法,通过执行以下命令查看当前 Bash 版本:

复制代码

执行后会显示类似以下的输出:

复制代码

方法二:查看 $BASH_VERSION 环境变量

如果你已经处于 Bash shell 中,可以使用以下命令查看当前 Bash 的版本信息:

复制代码

这个命令会直接输出 Bash 版本号,例如:

复制代码

方法三:使用 ps 命令和 grep

如果你想要查看当前 shell 会话的 Bash 版本,可以使用 ps 命令结合 grep 来查找:

复制代码

或者

复制代码

这两个命令都会显示当前使用的 Shell 路径,例如:

复制代码

1.3 Bash 配置文件与环境变量

Bash 的配置和环境变量管理涉及多个配置文件,这些文件决定了 Bash 的行为和环境设置。主要的配置文件包括:

用户级配置文件(针对 Bash Shell)

  • ~/.bashrc:用于交互式非登录 Shell,每次打开新的终端窗口时加载,典型用途是设置别名、函数、临时环境变量(如 PATH 追加)
  • ~/.bash_profile~/.profile:用于登录 Shell,通常用于设置环境变量(如 PATH、JAVA_HOME)和启动程序(如代理配置)
  • ~/.bash_logout:用于退出 Shell 时执行的命令

系统级配置文件

  • /etc/profile:用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效
  • /etc/bash.bashrc:系统范围的 bash 配置文件

如果希望定义一个环境变量并让它在每次启动电脑时都自动生效,可以通过将这个环境变量添加到 shell 启动配置文件中来实现。例如,要设置一个名为MY_VAR的环境变量,可以编辑~/.bashrc文件:

复制代码

在文件末尾添加:

复制代码

保存并退出后,执行以下命令使配置立即生效:

复制代码

二、Bash 变量使用与命令执行方式

2.1 变量的定义、赋值与引用

在 Bash 中,变量是存储数据的基本单位。与其他编程语言不同,Bash 中的变量大部分情况下不需要声明,可以直接赋值,默认值是字符串类型。

变量的定义和赋值语法非常简单:

复制代码

需要注意的是,等号两边不能有空格。变量名通常使用小写字母,这是 Bash 社区的惯例。值如果是字符串,建议用引号括起来,特别是包含空格时。

以下是变量定义和赋值的示例:

复制代码

变量的引用需要在变量名前加上$符号,更规范的写法是使用花括号:

复制代码

使用花括号的好处是可以避免在一些情况下引起歧义。例如:

复制代码

在使用变量时,可以使用双引号或单引号。双引号允许变量展开 ,而单引号则会将变量视为普通字符串

复制代码

2.2 环境变量与特殊变量

Bash 中有两类重要的变量:环境变量和特殊变量。

环境变量(全局变量):全局生效,在任何 bash 环境中都可以识别。可以使用export命令来创建或修改环境变量:

复制代码

要查看所有环境变量,可以使用:

复制代码

特殊变量具有预定义的特殊含义,这些变量只能被引用,无法再次被赋值:

1.位置参数变量

  • $0:当前脚本的名称
  • 1到9:传递给脚本的第一个到第九个参数
  • {10}、{11}等:第 10 个及以上的参数需要用大括号括起来

2.其他特殊变量:

  • $#:获取当前 shell 命令行中参数的总个数
  • $*:获取当前 shell 的所有参数,以一个字符串来表示所有参数
  • $@:表示所有的参数,但每个参数独立
  • $$:表示当前 shell 的进程 ID(PID)
  • $?:上一个命令执行状态的返回值,0 表示成功,非零表示失败

以下是一个使用特殊变量的脚本示例(保存为test.sh):

复制代码

执行该脚本:

复制代码

输出结果:

复制代码

2.3 命令执行方式与控制操作符

在 Bash 中,命令执行的方式可以分为简单命令、管道和命令列表三种形式。

简单命令是最常见的命令形式,由一系列用空白(制表符、空格)分隔的 token 组成,并由 shell 的控制符号终止(换行符、后台执行符 & 或命令分隔符;)。例如:

复制代码

命令的控制操作符包括:

  1. 换行符(newline):换行符是命令的一般默认终止符号,它告诉 shell 执行命令并在命令结束时将提示符返回给用户。
  1. 后台执行符(&):使用后台执行符结尾的命令将以异步的方式在子 shell 中执行:
复制代码
  1. 命令分隔符(;):命令分隔符用于将多个命令串联在一起,shell 会顺序执行这些命令,每个命令之间没有条件依赖:
复制代码
  1. 与操作符(&&):只有左边的管道执行成功(返回状态为 0),右边的管道才会执行:
复制代码
  1. 或操作符(||):只有左边的管道执行失败(返回状态非 0),右边的管道才会执行:
复制代码

这些控制操作符的优先级从高到低为:||和&&(相同优先级)、&、;。

2.4 命令替换与管道操作

命令替换是 Bash 中非常重要的特性,它允许将一个命令的输出作为另一个命令的参数或变量值。Bash 支持两种命令替换方式:

1.使用反引号(`):

复制代码

2.使用 $()(推荐方式):

复制代码

以下是命令替换的示例:

复制代码

管道操作使用管道符(|)将一个命令的输出作为另一个命令的输入。管道是由一个或多个命令组成的序列,每个命令之间通过管道符分隔。

管道的基本形式:

复制代码

在这个例子中,command1的标准输出会作为command2的标准输入,command2的标准输出会作为command3的输入。

|& 操作符用于将标准错误和标准输出一起传递给下一个命令,相当于重定向2>&1 |的缩写。

管道中的所有命令都是同时执行的,即command2并不会等待command1结束才执行。

以下是一个使用管道的示例:

复制代码

2.5 输入输出重定向

重定向允许改变命令的输入源和输出目标,而不是使用默认的标准输入(键盘)和标准输出(屏幕)。

输出重定向操作符

  • >:将正确输出覆盖至文件
  • >>:将正确输出追加至文件
  • 2>:将错误输出覆盖至文件
  • 2>>:将错误输出追加至文件
  • &>:将正确输出和错误输出导入到文件里
  • 2>&1:将正确输出和错误输出导入到文件

输入重定向操作符

  • <:从文件读取输入作为命令的输入

以下是重定向的示例:

复制代码

三、基本系统管理命令详解

3.1 文件管理命令

文件管理是 Linux 系统管理的基础,掌握文件管理命令对于日常运维至关重要。

3.1.1 文件和目录查看命令(ls)

ls 命令用于列出指定目录中的文件和子目录。

基本语法:

复制代码

常用选项:

  • -l:以长格式显示文件信息,包括文件权限、所有者、大小、修改时间等
  • -a:显示所有文件,包括以.开头的隐藏文件
  • -h:以人类可读的格式显示文件大小(如 K、M、G)
  • -t:按修改时间排序,最新的在前
  • -r:反向排序

示例:

复制代码

执行结果示例:

复制代码
3.1.2 创建文件和目录命令

touch 命令用于创建一个空文件或更新文件的时间戳:

复制代码

示例:

复制代码

mkdir 命令用于创建新目录:

常用选项:

  • -p:递归创建多级目录,这在创建嵌套目录时非常有用
  • -m:创建目录时设置权限

示例:

复制代码
3.1.3 删除文件和目录命令

rmdir 命令用于删除空目录:

复制代码

rm 命令用于删除文件或目录:

复制代码

常用选项:

  • -r:递归删除目录及其内容(危险操作!)
  • -f:强制删除,不提示确认
  • -i:交互式删除,每个文件都要确认

示例:

复制代码

重要提示:使用rm -r时要格外小心,因为它会递归删除目录下的所有内容,包括子目录和文件。建议在执行前先使用ls -l确认要删除的内容。

3.1.4 复制和移动文件命令

cp 命令用于复制文件或目录:

复制代码

常用选项:

  • -r:递归复制目录
  • -i:如果目标文件已存在,提示是否覆盖
  • -p:保留文件属性(权限、时间戳等)

示例:

复制代码

mv 命令用于移动文件或目录,或重命名文件:

复制代码

示例:

复制代码

3.2 用户管理命令

用户管理是 Linux 系统安全的核心,掌握用户管理命令对于系统管理员至关重要。

3.2.1 创建和管理用户

useradd 命令用于创建新用户账号:

复制代码

常用选项:

  • -g:指定用户的主组(默认会创建与用户名同名的组)
  • -G:指定用户的附加组(逗号分隔多个组)
  • -d:指定用户的主目录
  • -s:指定用户的登录 Shell
  • -m:自动创建用户主目录

示例:

复制代码

创建用户后,需要为其设置密码:

复制代码
3.2.2 用户切换命令

su 命令用于切换用户身份:

复制代码

选项说明:

  • 不加-:只切换用户,不改变环境
  • 加-(建议使用):切换用户并加载该用户的环境

示例:

复制代码
3.2.3 权限提升命令

sudo 命令允许普通用户在获得授权的情况下,以超级用户(root)或其他用户的身份执行指定的命令。

要使用 sudo,用户必须在/etc/sudoers文件中有相应的权限配置。例如,将用户加入 sudoers:

复制代码

在文件的适当位置添加一行(通常是文件末尾):

复制代码

例如:

复制代码

这样,用户 alice 就可以使用 sudo 命令了:

复制代码

3.3 文件权限管理命令

文件权限管理是 Linux 系统安全的基础,通过合理设置文件权限,可以保护系统和数据的安全。

3.3.1 修改文件权限(chmod)

chmod 命令是 "change mode" 的缩写,用来修改文件或目录对「所有者、所属组、其他人」的「读(r)、写(w)、执行(x)」权限。

chmod 支持两种模式:

符号模式:通过+(添加权限)、-(移除权限)、=(直接设置权限)操作,格式为:

复制代码

用户标识:

  • u:所有者(user)
  • g:所属组(group)
  • o:其他人(others)
  • a:所有用户(all)

权限标识:

  • r:读权限
  • w:写权限
  • x:执行权限

示例:

复制代码

数字模式:把r/w/x对应成数字(r=4、w=2、x=1),再将所有者、所属组、其他人的权限分别求和。

常见数字权限组合:

  • 755:所有者可读、可写、可执行;组用户可读、可执行;其他用户可读、可执行
  • 644:所有者可读、可写;组用户可读;其他用户可读
  • 700:只有所有者有全部权限
  • 400:只有所有者有读权限

示例:

复制代码
3.3.2 修改文件所有者(chown)

chown 命令是 "change owner" 的缩写,用来修改文件或目录的所有者和所属组。

基本语法:

复制代码

示例:

复制代码

3.4 系统信息查看命令

了解系统的基本信息对于系统管理和故障排除非常重要。

3.4.1 查看系统基本信息(uname)

uname 命令用于显示系统基本信息:

复制代码

常用选项:

  • -a:显示所有系统信息,包括内核名称、主机名、内核版本、节点名、系统时间、硬件名称、硬件平台、处理器类型等
  • -s:显示内核名称
  • -r:显示内核版本
  • -n:显示主机名

示例:

复制代码

输出示例:

复制代码
3.4.2 查看网络信息(ifconfig)

ifconfig 命令用于查看和配置网络接口的 IP 地址、子网掩码等信息:

复制代码

输出示例:

复制代码

四、Vim 编辑器使用详解

Vim 是 Linux 系统中最强大的文本编辑器之一,掌握 Vim 的使用对于系统管理员和开发者来说是必备技能。

4.1 Vim 三种模式详解

Vim 有三种主要的工作模式,你必须在不同模式间切换来完成不同的任务:

1. 命令模式(Command Mode)

  • 这是 Vim 的默认入口模式
  • 用于控制屏幕光标的移动、字符、字或行的删除、移动某区段等操作
  • 不能进行文字输入

2. 插入模式(Insert Mode)

  • 只有在插入模式才可以做文字输入
  • 按下ESC键可退回命令模式

3. 末行模式(Last-line Mode)

  • 也叫命令列模式,用于执行保存、退出、搜索、替换等高级命令
  • 在命令模式下按:键进入

4.2 打开和创建文件

使用 Vim 打开或创建文件的基本语法:

复制代码

打开文件的方式:

  • vim filename:打开一个文件,如果文件不存在则创建新文件(保存时才会生成)
  • vim -R filename:以只读模式打开文件
  • vim +10 filename:打开文件并跳转到第 10 行
  • vim + filename:打开文件并跳转到最后一行

打开多个文件:

复制代码

使用:n切换到下一个文件,:N切换到上一个文件。

4.3 基本编辑操作

4.3.1 插入模式操作

从命令模式进入插入模式有多种方式,不同的进入方式对应不同的光标位置:

|-----|--------------|-------------|---------------|
| 快捷键 | 进入方式 | 光标位置变化 | 适用场景 |
| i | insert(普通插入) | 光标前插入 | 在现有文本中间补内容 |
| I | Insert(行首插入) | 光标跳至行首插入 | 在代码行开头加注释(//) |
| a | append(追加插入) | 光标后插入 | 在现有文本末尾补内容 |
| A | 行尾插入 | 光标跳至行尾插入 | 在代码行末尾加分号(;) |
| o | 下行插入 | 在光标行下方新建行插入 | 在函数后新增代码 |
| O | 上行插入 | 在光标行上方新建行插入 | 在函数前新增注释 |

4.3.2 光标移动操作

在命令模式下,可以使用以下快捷键进行光标移动:

基本方向键(符合左手控制方向的人体工学):

  • h:左移一个字符
  • j:下移一个字符
  • k:上移一个字符
  • l:右移一个字符

快速定位

  • 0(数字零):跳至行首
  • $:跳至行尾
  • gg:跳至文件开头
  • G:跳至文件结尾
  • nG:跳至第 n 行(如 10G 跳至第 10 行)
4.3.3 删除操作

Vim 的删除操作基于 "d + 移动范围" 的模式,即 "删除从当前光标到目标位置的内容":

|-----|-------------------------|----------------------|
| 命令 | 功能 | 示例 |
| x | 删除光标所在字符(类似 Delete) | 删除单个错误字符 |
| X | 删除光标前一个字符(类似 Backspace) | 修正输入错误 |
| dd | 删除当前行(整行删除) | 删除无效代码行 |
| ndd | 删除从当前行开始的 n 行 | 批量删除注释块(如 5dd 删 5 行) |
| d0 | 删除从光标到行首的内容 | 删除行首多余空格 |
| d$ | 删除从光标到行尾的内容 | 删除行尾多余字符 |
| dw | 删除从光标到下一个单词开头 | 删除单个单词 |
| dG | 删除从当前行到文件尾的内容 | 清空文件后半部分 |

4.3.4 复制和粘贴操作

复制操作使用y(yank)命令,操作逻辑与删除操作一致:

|-----|---------------|------------|
| 命令 | 功能 | 示例 |
| yy | 复制当前行 | 复制单行代码 |
| nyy | 复制从当前行开始的 n 行 | 复制多行函数代码 |
| y0 | 复制从光标到行首的内容 | 复制行首注释 |
| y$ | 复制从光标到行尾的内容 | 复制行尾关键信息 |
| yw | 复制从光标到下一个单词开头 | 复制单个变量名 |
| yG | 复制从当前行到文件尾的内容 | 复制整个文件后半部分 |

粘贴操作使用p或P命令,无需进入插入模式:

  • p(小写):将寄存器内容粘贴到光标后
  • P(大写):将寄存器内容粘贴到光标前
4.3.5 撤销和恢复操作

Vim 支持多级撤销和恢复:

  • u:撤销上一步操作
  • Ctrl+r:恢复上一步撤销的操作
  • U(大写):撤销对当前行的所有修改

4.4 保存和退出 Vim

在末行模式下,可以使用以下命令进行保存和退出:

|--------|------------------|--------------|
| 命令 | 功能 | 注意事项 |
| :w | 保存当前文件(write) | 需有文件写入权限 |
| :w 文件名 | 另存为指定文件 | 如:w test.bak |
| :q | 退出 Vim(quit) | 若文件未保存,会提示 |
| :q! | 强制退出 Vim(不保存) | 高危操作,确保无需保存 |
| :wq | 保存并退出 Vim | 等价于:x |
| :x | 保存并退出(仅当文件修改时保存) | 推荐日常使用 |
| :wq! | 强制保存并退出 | 即使没有权限也保存 |

快捷键方式(无需进入末行模式):

  • ZZ:保存并退出(等价于:wq)
  • ZQ:不保存退出(等价于:q!)

4.5 查找和替换操作

4.5.1 查找操作

在命令模式下,使用/进行查找:

复制代码

查找命令会从光标位置开始向下查找。查找后,可以使用:

  • n:跳至下一个匹配
  • N:跳至上一个匹配
4.5.2 替换操作

替换操作使用末行模式的:s命令,核心格式是:

复制代码

常用选项:

  • 无选项:仅替换当前行第一个匹配
  • g:替换当前行所有匹配(global)
  • %g:替换整个文件所有匹配(% 代表所有行)
  • %gc:全局替换并确认(每处匹配都提示是否替换)
  • gi:替换时忽略大小写

示例:

复制代码

4.6 其他实用操作

显示和隐藏行号

复制代码

设置 Tab 键宽度

复制代码

将 Tab 转换为空格

复制代码

打开新文件

复制代码

以 root 权限保存文件(解决权限不足问题):

复制代码

五、实战案例:创建 Bash 脚本

为了巩固所学知识,我们来创建一个简单的 Bash 脚本,展示如何综合运用变量、命令执行和文件操作。

5.1 需求分析

创建一个名为backup_files.sh的脚本,实现以下功能:

  1. 备份指定目录下的所有文件到备份目录
  1. 在备份文件名中包含时间戳
  1. 记录备份日志
  1. 可以通过参数指定源目录和目标目录

5.2 脚本编写

复制代码

5.3 脚本解释

1.脚本开头:#!/bin/bash指定使用 Bash 解释器

2.参数检查:使用#检查参数个数,使用0获取脚本名称

3.变量使用:使用1和2获取位置参数

4.条件判断:使用if语句进行条件检查

5.命令执行:使用tar命令进行文件打包压缩

6.错误处理:使用$?检查命令执行状态

7.日志记录:使用>>重定向操作符追加日志

8.时间戳:使用date命令获取当前时间

5.4 执行脚本

给脚本添加执行权限并执行:

复制代码

输出示例:

复制代码

六、总结与最佳实践

通过本文的学习,你已经掌握了 Bash Shell 的基础操作、系统管理命令以及 Vim 编辑器的使用方法。在实际应用中,还需要注意以下最佳实践:

6.1 变量命名规范

  • 使用小写字母命名变量,多个单词用下划线分隔(如my_variable)
  • 环境变量使用大写字母(如PATH、HOME)
  • 避免使用系统保留变量名

6.2 命令执行注意事项

  • 养成使用man命令查看帮助文档的习惯
  • 对于危险操作(如rm -r),先使用ls -l确认
  • 使用&&和||进行条件执行,提高脚本的鲁棒性
  • 合理使用管道和重定向,简化命令

6.3 Vim 使用技巧

  • 熟练掌握三种模式的切换,特别是ESC键的使用
  • 多练习光标移动和文本操作快捷键,提高编辑效率
  • 学会使用查找和替换功能,特别是全局替换
  • 根据个人习惯配置.vimrc文件

6.4 安全注意事项

  • 谨慎使用sudo和su命令,确保有必要的权限
  • 合理设置文件权限,遵循最小权限原则
  • 避免使用rm -rf等危险命令,特别是在根目录下
  • 定期备份重要文件和配置

Bash Shell 是 Linux 系统管理的核心工具,掌握其基础操作是迈向高级系统管理的第一步。通过不断练习和实践,你将能够编写出高效、安全的 Shell 脚本,大幅提升系统管理效率。

相关推荐
Scott9999HH8 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海9 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大13 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai13 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜13 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa14 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio