Linux 基础笔记


目录:

Linux 基础笔记

Linux命令是什么?

Linux命令是用户与Linux操作系统进行交互的指令,通过在终端(Terminal)中输入特定的命令字符串,可让系统执行相应操作,如文件管理、进程控制、系统配置等。它们是Linux系统操作的核心,基于命令行界面(CLI)工作,相比图形界面(GUI),往往更高效、灵活,尤其在服务器管理、自动化脚本等场景中不可或缺。

Linux命令的基本构成

大多数Linux命令的基本格式为: 命令 [选项] [参数]

  • 命令:核心指令,如ls(列出文件)、cd(切换目录)。
  • 选项:调整命令行为的参数,通常以-(短选项,如-l)或--(长选项,如--help)开头,用于扩展命令功能。
  • 参数:命令作用的对象,如文件名、目录路径等。

示例ls -l /home 中,ls是命令,-l是选项(表示以详细列表形式显示),/home是参数(指定操作的目录)。

Linux命令的特点

1.大小写敏感:命令、文件名、目录名均区分大小写,如Lsls是不同的命令(通常命令为小写)。

2.自动补全:在终端中输入命令或路径时,按Tab键可自动补全,减少输入错误。

3.历史记录:按/键可查看之前输入的命令,history命令可列出所有历史记录。

4.管道与重定向

  • 管道(|):将一个命令的输出作为另一个命令的输入,如ls -l | grep ".txt"(筛选出.txt文件)。
  • 重定向:>(覆盖输出到文件)、>>(追加输出到文件),如echo "hello" > test.txt(将“hello”写入test.txt)。

掌握Linux命令是学习Linux系统的基础,通过实际练习(如创建文件、管理目录、查看系统信息)可快速熟悉其用法,复杂命令可通过man手册或网络文档逐步深入学习。

SHELL是什么?

如果你用过电脑,肯定见过图形界面——比如Windows的桌面、文件夹窗口,用鼠标点点就能操作。但Shell其实是另一种和电脑“对话”的方式:不用鼠标,全靠打字命令。

简单说,Shell就是一个“翻译官”:

  • 你输入一行命令(比如“复制文件”“新建文件夹”),Shell会把它翻译成电脑能懂的语言(底层代码)。
  • 电脑执行完,Shell再把结果翻译成你能看懂的文字,显示给你。

为啥要用Shell? 图形界面虽然直观,但面对复杂操作时效率很低。比如你想把1000个文件按规则重命名,用鼠标点到手酸;但用Shell,一行命令可能就搞定了。

常见的Shell有这些:

  • Windows里:早期叫“命令提示符(CMD)”,后来升级成“PowerShell”,功能更强。
  • Linux/Mac里:最常用的是“bash”,还有“zsh”“fish”等,语法更简洁。

举个简单例子

比如你想在当前文件夹里新建一个叫“test”的文件夹:

  • 用图形界面:右键→新建→文件夹→输入“test”。
  • 用Shell:直接输入 mkdir test ,回车就搞定了(mkdir 是“新建文件夹”的命令)。

再比如查看文件夹里的内容:

  • 图形界面:双击文件夹。
  • 用Shell:输入 ls(Linux/Mac)或 dir(Windows),回车就显示所有文件。

总之,Shell就是一种“用文字命令操作电脑”的工具,是用户和系统进行交互的的一类软件。熟练后能大幅提升效率,尤其适合程序员、运维等需要批量处理任务的场景。

第一部分:系统管理命令

1.sh

sh 是 Unix 系统中历史悠久的基础 shell,语法简洁、兼容性强,适合编写跨平台的简单脚本。虽然功能不如 bash 丰富,但仍是理解 shell 原理和脚本开发的重要基础。在实际使用中,若需复杂功能,可优先选择 bash,但 sh 的兼容性仍使其在特定场景中不可替代。

2.bash (csh/tcsh/zsh)

bash(Bourne Again SHell)是 Unix 和类 Unix 系统中最流行的命令行解释器(shell)之一,它是 Bourne Shell(sh) 的增强版本,兼容 sh 的语法并添加了大量扩展功能。bash 由 Brian Fox 于 1989 年为 GNU 项目开发,现在是大多数 Linux 发行版和 macOS 的默认 shell。

bash 的核心特点

  • 兼容 sh:完全支持 sh 的语法,可直接运行现有的 sh 脚本。
  • 交互式增强:提供命令补全、历史记录、别名等功能,提升用户体验。
  • 脚本编程扩展:支持数组、函数、正则表达式、循环控制结构等高级特性。
  • 环境定制:通过 .bashrc.bash_profile 等配置文件自定义 shell 环境。

基本语法

bash 的语法与 sh 基本一致,但扩展了更多功能:

bash [选项] [脚本文件] [参数]
  • 无选项/参数:进入 bash 交互模式。
  • 脚本文件:执行指定的 bash 脚本(如 bash script.sh)。
  • 参数:传递给脚本的参数(在脚本中通过 $1$2 等变量获取)。

常用选项

bash 的选项比 sh 更丰富,常见的有:

  • -c "命令":执行字符串中的命令(同 sh -c)。 示例:bash -c "ls -l; pwd"
  • -i:以交互式模式运行(用于启动新的 bash 会话)。 示例:bash -i
  • -x:执行脚本时显示详细的命令执行过程(调试用,同 sh -x)。 示例:bash -x script.sh
  • -n:检查脚本语法但不执行(同 sh -n)。

bash 与 sh 的关键区别

特性 sh(Bourne Shell) bash(Bourne Again Shell)
命令补全 ✅(按 Tab 键自动补全命令或文件名)
历史命令记录 ✅(按 ↑ 键查看历史命令,支持 history 命令)
别名(alias) ✅(如 alias ll='ls -l'
数组支持 ✅(如 arr=(1 2 3)
函数语法 有限(需 function 关键字) 更灵活(可省略 function
正则表达式匹配 ✅(如 [[ $str =~ pattern ]]
扩展的条件判断 [ ] 支持 [[ ]](( ))(更强大)

bash 的高级特性

1.命令补全: 按 Tab 键自动补全命令、文件名或路径,提高输入效率。

2.历史命令

  • / 键浏览历史命令,或使用 history 命令查看所有历史记录。
  • 使用 !n 执行历史记录中第 n 条命令(如 !100)。

3.管道与重定向

  • 管道 |:将一个命令的输出作为另一个命令的输入(如 ls | grep txt)。
  • 重定向 >/>>:将输出保存到文件(覆盖/追加)。

4.shell常用快捷键

快捷方式 作用
Tab 自动补全命令或文件(目录)的名称
Ctrl+c 结束终端中正在运行的命令
Ctrl+d 从某些程序中退出 ( exit ) \quit\ q\ vim --> ESC :q!
Ctrl+a 移动光标到终端开头
Ctrl+e 移动光标到终端结尾
Ctrl+l 清屏
上方向键 找回历史命令,向上找 history
下方向键 找回历史命令,向下找
Ctrl+s/Ctrl+q 锁定与解锁Shell
Ctrl+z 将前台正在运行的服务放置到后台运行

3.type:查看命令的类型

在 shell 中,type 是一个用于确定命令如何被解释和执行的内置命令。它可以帮助你了解某个命令是 shell 内置命令、外部可执行文件,还是别名(alias)或函数。

Shell内部命令(了解)

alias, bg, bind, break, builtin, caller, cd, command,
compgen, complete, compopt, continue, declare,  dirs,  disown,  echo,
enable, eval, exec, exit, export, false, fc, fg, getopts, hash, help,
history, jobs, kill,  let,  local,  logout,  mapfile,  popd,  printf,
pushd,  pwd,  read, readonly, return, set, shift, shopt, source, sus‐
pend, test, times, trap, true, type, typeset, ulimit, umask, unalias,
unset, wait - bash built-in commands 

基本语法

type [选项] 命令名
  • 选项:常用的有 -a(显示所有可能的位置)、-t(只显示类型)等。
  • 命令名:要查询的命令(如 lscdtype 本身)。

核心功能

type 命令主要用于解决以下问题:

1.判断命令类型: 确定一个命令是 内置命令(shell 自带的)、外部命令(系统中的可执行文件)、别名 还是 函数

2.查找命令位置: 对于外部命令,显示其在文件系统中的路径(类似 which 命令)。

常见输出类型

type 命令的输出可能有以下几种:

  • builtin:shell 内置命令(如 cdechotype 本身)。
  • file:外部可执行文件(如 /bin/ls/usr/bin/git)。
  • alias:用户定义的别名(如 ll='ls -l')。
  • function:shell 函数(通常在配置文件中定义)。
  • keyword:shell 关键字(如 iffor)。

示例

1.查询 ls 命令

$ type ls
ls is aliased to `ls --color=auto'  # 在 Linux 中,ls 通常是带颜色选项的别名

2.查询 cd 命令

$ type cd
cd is a shell builtin  # cd 是 shell 内置命令,无需外部文件

3.查询 python 命令

$ type python
python is /usr/bin/python  # 外部命令,位于 /usr/bin 目录下

4.使用 -a 选项显示所有可能的位置

$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls  # 原始命令位置

5.使用 -t 选项只显示类型

$ type -t cd
builtin

$ type -t python
file

与其他命令的对比

命令 功能描述 示例输出
type 显示命令的类型和位置(最全面) ls is aliased to 'ls --color=auto'
which 仅查找外部命令的路径(忽略别名和内置命令) /usr/bin/git
whereis 查找命令的二进制文件、源代码和手册页位置 ls: /bin/ls /usr/share/man/man1/ls.1.gz

使用场景

1.调试脚本
确保使用的是正确版本的命令(如避免别名干扰)。

2.跨平台兼容性
在不同系统中,某些命令可能是内置命令或外部命令(如 echo 在某些系统上是内置的,在其他系统上可能是外部命令)。

3.验证别名或函数
检查自定义的别名或函数是否正确定义。

4.man :查看命令的帮助文档

“忘了用法?查查手册。”

用法:man 命令名

  • 显示指定命令的完整手册,包括用法、参数和示例。

man 常用操作示例:

# 1. 查看 ls 的手册
man ls

# 2. 在手册中搜索关键词,比如 "file"
# 按 / 输入关键词,然后按回车查找
# /file

# 3. 退出手册
# 按 q 键退出

小总结:

  • man 命令名:查命令的说明书。
  • / 搜索:快速定位关键词。

man,不再为忘记命令用法发愁!

5.--help:快速帮你上手

“不想翻手册?用它快速查看命令用法!”

用法:命令 --help

  • 显示命令的简要说明,包括常用选项和用法。

比如查看 ls 的简要帮助:

ls --help

--help简洁易懂,适合快速上手命令操作!

命令 --help # 显示命令参数

6.pwd:告诉我,我在哪儿?

“迷路了?这个命令就是你的导航。”

用法:pwd

  • 全称 Print Working Directory,用来显示你当前所在的工作目录,也就是告诉你“我在哪儿”。

比如,你在终端输入:

pwd

输出可能是:/home/user/Documents

意味着你现在的工作目录是 /home/user/Documents。简单来说,这个命令相当于给你当前的位置标了个“导航点”。

7.ls:看看这地方都有什么

“逛文件夹时的必备工具。”

用法:lsls [选项] [目录名]

  • “List”的缩写,用于列出目录中的文件和子目录。简单来说,这个命令就是告诉你“当前目录里都有什么东西”。
  • -l 参数,还能看到更详细的信息,比如文件大小和权限。
  • -a 显示所有文件,包括隐藏文件
  • -d 只显示隐藏文件
  • -h 显示文件大小单位
  • --color=auto 按照文件的分类高亮显示文件 试试这个:
ls -l

还有ls -al,这会连隐藏文件(以.开头的文件)也一并显示。

8.cd:切换目录

“想去别的文件夹?用它轻松切换!”

用法:cd 目录名

  • cd全称 “Change Directory”,顾名思义,就是切换目录。

进入指定目录,如果不写目录,则回到用户的主目录(家目录)。

./    # 表示当前路径
../   # 上层路径
~     # 代表家目录

cd ~      # 进入家目录(用户主目录)
cd ~/Desktop  # 跳到桌面目录

cd ..    # 返回上一级目录
cd -     # - 是上一次访问的目录,像“返回”按钮一样。
cd       # 直接敲cd回到当前用户的家目录

# 绝对路径:从"根"/ 开始的路径是绝对路径
# 相对路径:只要不从"根"/开始的路径都是相对路径,从当前路径开始的路径

9.tree:目录结构展示工具

“想直观展示目录结构?用它一键搞定!”

用法:tree [选项] [路径]

  • 以树状结构显示目录及文件,方便查看目录层次和文件内容。

常用操作:

# 1. 显示当前目录的树形结构
tree

# 2. 显示指定目录的树形结构
tree /path/to/directory

# 3. 限制层级深度(如最多显示两层)
tree -L 2

# 4. 显示文件大小
tree -h

# 5. 只显示目录(不显示文件)
tree -d

# 6. 输出结果到文件
tree > tree_output.txt

小总结:

  • 显示树形结构:tree 快速展示目录结构。
  • 限制深度:-L 控制层级,避免输出过长。
  • 显示文件信息:-h 加上文件大小,-d 只看目录。

tree 是快速查看和分享目录结构的好工具,让层次清晰直观!

显示系统根目录

tree -Ld 1 /  # -L 表示显示的层数 -d 只显示目录

/  # “根”目录 所有文件目录都必须挂载在“根”目录上(root)
├── bin -> usr/bin     # binary 二进制的程序,所有用户都可使用的程序,是/usr/bin的一个软链接 *****
├── boot               # 启动目录,存放系统内核,启动脚本    *****
├── dev                # device 设备,硬件设备的映射文件,加载硬件资源  *****
├── etc                # 配置文件,系统配置文件,yum安装的服务的配置文件 *****
├── home               # 普通用户的家目录
├── lib -> usr/lib     # library 程序依赖库,系统中程序共享的依赖库
├── lib64 -> usr/lib64 # 64位的library 
├── media              # 媒体文件,用于挂载光盘.U盘.移动硬盘  *****
├── mnt                # 挂载临时设备                  *****
├── opt                # optional 可选的,安装的第三方程序。 * 
├── proc               # 虚拟目录,内存映射文件 *
├── root               # 管理员的家目录    
├── run                # 临时文件系统,系统启动信息,程序运行的进程号 *
├── sbin -> usr/sbin   # 管理员才能用的命令
├── srv                # 程序或服务产生的一些数据 * 
├── sys                # 虚拟的档案系统 * 
├── tmp                # 用于存放临时文件的目录。所有用户都可以使用的目录。*****
├── usr                # Unix System Resource 所有和系统相关的程序.服务都会安装到这里 *****
└── var                # 系统服务默认的数据存放目录 ***** 

10.clear:“屏幕太乱了,清清场。”

用法:clear

  • 一键清空终端屏幕,重新开始。

11.alias:命令也能取外号

“敲太长?给它改个短名字!”

用法:alias 别名='实际命令' alias -a # 查看所有生效的别名

比如:

alias ll='ls -alF'

以后输入 ll 就等于 ls -alF

12.unalias:取消外号

unalias -a #取消所有别名

13.which:这个命令藏哪儿了?

“找出命令的安装路径。”

用法:which 命令名

  • 显示指定命令的绝对路径,告诉你系统中实际执行的是哪个命令。

比如:

which bash
# 输出: /usr/bin/bash

说明 bash 命令安装在 /usr/bin/bash 目录下。

14.env:查看环境变量

“想知道系统有哪些环境变量?用它!”

# 查看所有环境变量
env

15.export:设置环境变量

“想添加或修改环境变量?用它!”

# 设置环境变量
export MY_VAR="Hello World"

# 验证变量是否设置成功
echo $MY_VAR

# 将目录添加到 PATH
export PATH=$PATH:/new/path

# 永久保存变量到 ~/.bashrc
echo "export MY_VAR='Hello World'" >> ~/.bashrc

16.source: 重新加载系统配置

source ~/.bashrc  # 使用 source 加载配置

17.file:查看文件类型

  • - text (file) 脚本.程序源代码.配置文件.日志文件
    • ASCII
    • UTF-8 (Unicode)
  • l link 链接文件,快速访问某些文件
  • b block 光盘.U盘.硬盘
  • c character 字符类型,输入输出设备
  • d directory 目录类型的文件
  • - executable 可执行文件(二进制文件)/usr/bin/
  • p pipe 管道类型的文件用于程序与程序间数据传输\
  • s socket 网络套接字,用于程序间的网络通信

18.reboot:立即重启系统

sudo reboot

等价命令

sudo shutdown -r now  # -r 表示重启,now 表示立即执行
sudo systemctl reboot  # 适用于使用 systemd 的系统(如 Ubuntu 16.04+、CentOS 7+)

特点

  • 直接调用底层重启流程,不发送通知给用户。
  • 适用于紧急重启场景。

19.shutdown:优雅地关闭或重启系统(推荐方式)

sudo shutdown [选项] [时间] [警告信息]

常用选项

  • -h:关机(halt)。
  • -r:重启(reboot)。
  • -c:取消已计划的关机(cancel)。

时间参数

  • now:立即执行。
  • +5:5分钟后执行(+分钟数)。
  • 23:30:指定时间执行(如今晚11:30)。

示例

sudo shutdown -h now  # 立即关机
sudo shutdown -r +10 "系统将在10分钟后重启,请保存工作!"  # 10分钟后重启并通知用户
sudo shutdown -c  # 取消上述计划

特点

  • 会向所有登录用户发送警告信息,并等待进程优雅退出。
  • 支持定时操作,适合非紧急场景。

20.init切换系统运行级别

sudo init [运行级别]

常见运行级别

  • 0:关机(等同于 shutdown -h)。
  • 6:重启(等同于 shutdown -r)。
  • 1sS:单用户模式(维护模式)。
  • 3:多用户文本模式(适用于服务器)。
  • 5:多用户图形模式(适用于桌面系统)。

示例

sudo init 0  # 关机
sudo init 6  # 重启
sudo init 1  # 进入单用户模式

特点

  • 基于传统的 SysVinit 系统,部分现代 Linux 系统(如 Ubuntu 16.04+、CentOS 7+)已改用 systemd,但仍兼容 init 命令。

21.poweroff关机

sudo poweroff  # 推荐方式(跨系统兼容)

22.halt 关机

sudo halt      # 传统方式

等价命令

sudo shutdown -h now  # 等同于 poweroff
sudo systemctl poweroff  # 基于 systemd 的系统

区别

  • poweroff:尝试切断物理电源(如关闭服务器)。
  • halt:停止系统运行,但可能保持电源开启(适用于虚拟机)。

23.systemctl

功能:基于 systemd 管理系统服务和状态(取代传统的 init 和部分 service 命令)。 语法

sudo systemctl [操作] [目标]

常见操作

  • reboot:重启系统。
  • poweroff:关机。
  • halt:停止系统。
  • suspend:挂起(睡眠)。
  • hibernate:休眠(保存会话到磁盘)。

  • systemclt start 服务名.service 启动服务

  • systemclt stop 服务名.service 关闭服务
  • systemclt restart 服务名.service 重启服务
  • systemclt status 服务名.service 查看服务状态
  • systemclt enable 服务名.service 开机自启动服务
  • systemclt disable 服务名.service 开机不启动
  • systemclt reload 服务名.service 重载服务(重新加载服务配置文件)
  • systemctl list-unit-files --type=service 查看各个级别的启动与禁用情况 示例
sudo systemctl reboot  # 重启
sudo systemctl poweroff  # 关机
sudo systemctl suspend  # 挂起

特点

  • 现代 Linux 系统(如 Ubuntu 16.04+、CentOS 7+)的标准管理工具。
  • 统一管理服务、挂载点、定时器等,替代了多种传统命令。

命令对比与选择建议

命令 适用场景 特点
shutdown 优雅关机/重启(推荐日常使用) - 支持定时操作
- 通知用户
- 等待进程退出
- 跨系统兼容
reboot 紧急重启 - 立即重启
- 不通知用户
- 简单直接
poweroff 关机 - 等同于 shutdown -h now
- 尝试切断物理电源
init 0/6 传统 SysVinit 系统 - 兼容性强
- 基于运行级别概念
- 部分新系统仍兼容但不推荐优先使用
systemctl 现代 Linux 系统 - 统一管理系统状态和服务
- 推荐在 systemd 系统中使用

注意事项

1.权限要求:所有命令都需要管理员权限(sudo)。

2.数据安全: - 非紧急情况建议使用 shutdown,避免数据丢失。 - 若系统无响应,可尝试 reboot -f(强制重启,可能导致数据损坏)。

3.特殊场景: - 远程服务器:优先使用 shutdown 并指定合理时间(如 +5),确保有足够时间保存工作。 - 嵌入式系统:部分设备可能需要特定命令(如 sync 确保数据写入磁盘后再关机)。

总结

  • 日常使用:推荐 shutdown(优雅、可控)或 systemctl(现代系统)。
  • 紧急情况:使用 rebootpoweroff
  • 传统系统:使用 init 切换运行级别。

第二部分:文件操作,动手搞事情

24.touch:新建一个文件。

“想新建一个空文件?就用 touch !”

用法:touch 文件名

  • “touch” 的作用是新建一个空文件,比如:
touch newfile.txt
  • “touch” 更新文件的时间戳(访问时间和修改时间)
# 假设 file.txt 已存在
touch file.txt  # 更新 file.txt 的时间戳

25.vi/vim: 文本编辑器

“想在命令行编辑文件?用它轻松搞定!”

用法:vim 文件名

  • 如果文件不存在,会新建一个文件。

基本操作:

# 1. 打开文件
vim file.txt

# 2. 进入编辑模式
# 在文件中按 `i` 进入编辑模式,开始修改内容。

# 3. 保存并退出
# 按 `Esc` 键退出编辑模式,然后输入 `:wq` 保存并退出。

# 4. 退出不保存
# 按 `Esc` 键退出编辑模式,然后输入 `:q!` 强制退出。
  • 普通命令模式:删除.复制.剪切数据.替换(默认)

  • 编辑模式:输入文本,修改文本

  • 末行模式:保存.退出.替换.查找.vim设置

从普通命令模式进入编辑模式

  • 按i\a\o|I\A\O
  • i:将光标插入到当前位置
  • a:将光标插入到当前的后一位
  • o:将光标移动到下一行
  • I:将光标移动到行首
  • A:将光标移动到行尾
  • O:将光标移动上一行

从编辑模式进入到普通命令模式按ESC

从普通命令模式输入":" 进入末行命令模式

# 普通命令模式
  跳转 : gg | GG 
    gg   # 光标跳转到第一行
    ngg  # n为一个整数,跳转到第n行
    GG   # 跳转到最后一行
  按行删除: dd 
    dd   # 删除光标所在当前行
    ndd  # 删除包括光标所在行的n行
  按行复制:yy
    yy   # 复制当前行
    nyy  # 复制n行
  撤销操作: u
  粘贴:p # 粘贴被dd删除的行或yy复制的行
  撤销撤销:ctrl + r

# 末行命令模式
   设置行号:set nu
   取消行号:set nonu
   保存:w   | w 新文件名 #另存为其他文件
   退出: q
   强制退出:q!
   保存退出:x
   查找: /关键字 从上向下找
         ?关键字 从下向上找
         n N
         支持正则表达式
   替换:
        :s/原字符/新字符     光标当前行替换一次
        :s/原字符/新字符/g   替换光标所在行中所有的原字符
        :%s/原字符/新字符/g  替换全文的所有原字符
   跨文件编辑
        :e /路径/文件
   读入其他文件内容
        :r /路径/文件
   # 让拥有sudo权限的用户保存只读文件
   w !sudo tee %
   # 普通使用root权限编辑文件
   sudo  vim

修改主机名 /etc/hostname

vim /etc/hostname
###################
#直接修改成我们需要的名字
MyLinux01
###################
# 保存退出
# 重启才会生效
hostname MyLinux01  # 临时修改主机名

26.mkdir:创建目录

“想建个新文件夹?用 mkdir 搞定!”

用法:mkdir 文件夹名

  • “Make Directory” 的缩写,用于创建文件夹( 新的目录 )。比如:
# 1. 创建一个新目录
mkdir my_folder

# 2. 同时创建多级目录
# -p:递归创建,不存在的父目录会一并创建
mkdir -p parent_folder/child_folder

27.cp:复制粘贴小能手

“想要两个一模一样的?复制一个!”

用法:cp 源文件 目标位置

  • “Copy” 的缩写,用于复制文件或目录,帮你轻松搞定备份和分发任务。

比如,复制一个文件:

cp file.txt backup.txt

这会把 file.txt 复制成 backup.txt

复制整个文件夹?加个 -r 参数就行:

cp -r my_folder my_folder_copy

小贴士

  • cp 不会动原文件,原地保存,安心又稳妥!
  • 如果目标文件已经存在,会直接覆盖,所以用前要小心。

28.mv:搬家+改名双能手

“这个文件名不好听?改了!或者换个位置放。”

用法:mv 源文件 目标位置

  • “Move” 的缩写,用于移动文件或重命名文件。

1、重命名

mv old_name.txt new_name.txt

这会把文件从 old_name.txt 改成 new_name.txt

2、搬家

mv file.txt /home/user/Documents/

file.txt 移动到 /home/user/Documents/ 文件夹下。

3、两者一起

mv file.txt /home/user/Documents/new_name.txt

同时改名字并搬家!

小贴士

  • mv 是“剪切”操作,源文件会被移除。
  • 小心误操作!移动目标路径错误可能会导致文件不容易被找到 ,尤其是重命名时。

29.rm:删除大师,不留痕迹

“不想要了?直接扔掉!”

用法:rm 文件名rm -r 目录名

  • “Remove” 的缩写,用于删除文件或目录。 注意:删除的东西没有回收站!没有回收站!没有回收站!(重要的事情说三遍)

1、删除文件:

rm file.txt

这会直接删除 file.txt

2、删除目录:

  1. 如果目录是空的,可以用 rmdir
  2. 如果目录里有文件,用 rm -r
rm -r my_folder

加了 -r 参数,会递归删除目录及其内容。

3、强制删除:

有时候系统会提示“文件只读,无法删除”。加个 -f 参数就可以了:

rm -rf my_folder

-r 是递归删除,-f 是强制删除,配合起来是个危险的“毁灭组合”。用这个命令时,一定要看清楚路径!

小贴士:安全删除指南

  • 误删保护:建议先用 ls 看看目录内容,确认没问题再删除。
  • 慎用通配符:比如 rm -rf *,可能会把当前目录里的所有东西都删光!

第三部分:文本查看与处理

30.cat:按顺序查看文件内容

用法:cat 文件名

  • 这个命令可以快速查看文件内容,甚至把多个文件拼起来显示:
# 创建两个测试文件
echo "这是文件1的内容" > file1.txt
echo "这是文件2的内容" > file2.txt

# 查看单个文件内容
cat file1.txt

# 拼接文件内容
cat file1.txt file2.txt > combined.txt

# 显示合并后的文件内容(-n : 加上行号)
cat -n combined.txt

# 查看cup详情
cat /proc/cpuinfo

# 查看内存的详情
cat /proc/meminfo

31.tac:按倒序查看文件内容

tac 是反过来显示内容,最后一行先显示,有趣吧?

32.more:逐页查看文件

more file.txt
  • 按空格翻页
  • q 退出

33.less:更灵活的翻页查看

less file.txt
  • 用上下箭头滚动
  • 输入 /关键词 搜索
  • q 退出

区别:

  • more:简单只能向后翻页。
  • less:功能更强大,支持前后翻页 和搜索。

lessmore 更好用,文件一多就用它,翻页舒服又方便!

34.head: 文件内容看“开头”

“文件太大?只看最重要的部分!”

用法:

  • head 文件名:看文件的前 10 行。

35.tail文件内容看“结尾”

  • tail 文件名:看文件的最后 10 行。

默认显示前 10 行。想自定义行数?加 -n 参数。

常用操作:

1.指定行数:

head -n 5 file.txt   # 看前 5 行
tail -n 8 file.txt   # 看最后 8 行

2.实时监控文件变化:

tail -f file.txt   # 动态显示新增内容

headtail,一个看开头,一个看结尾,简单实用!

36.grep:文本搜索小能手

“从一堆文本中快速找到你想要的信息?用它效率倍增!”

用法:grep [选项] "关键词" 文件/目录

  • 文本搜索神器,支持关键词匹配、忽略大小写、行号显示等功能,适合日志分析、快速定位问题。

常用操作:

# 1. 查找文件中包含 "error" 的行
grep "error" logfile.txt

# 2. 忽略大小写匹配
grep -i "error" logfile.txt

# 3. 显示匹配行的行号
grep -n "error" logfile.txt

# 4. 递归搜索目录下所有文件
grep -R "error" /path/to/directory

# 5. 反向匹配:只显示不包含 "error" 的行
grep -v "error" logfile.txt

# 6. 搜索多个关键词(用 \| 分隔)
grep -E "error|fail" logfile.txt

# 7. 统计匹配的行数
grep -c "error" logfile.txt

# 8. 只显示匹配的文件名
grep -l "error" *.txt

# 9.递归搜索 + 忽略二进制文件 (常用)
grep -nRI "keyword" /path/to/directory

小总结:

  • 匹配方式: 默认区分大小写,-i 忽略大小写,-E 支持多关键词匹配。
  • 显示信息:-n 显示行号,用 -c 统计匹配行数,用 -l 仅列出文件名。
  • 过滤内容:-v 显示不匹配关键词的内容。
  • 递归搜索:-r 搜索目录及子目录中的所有文件。

grep 是命令行中的搜索神器,轻松应对日志分析和快速文本定位!

37.find:文件搜索小能手

“找文件、筛文件、批量操作文件,全靠它!”

用法:find [搜索路径] [条件] [操作]

  • 灵活强大的文件查找工具,支持按文件名、类型、大小、修改时间等条件精准搜索,还能直接对结果执行操作。

常用操作:

# 1. 按名称查找:查找当前目录下名为 file.txt 的文件
find . -name "file.txt"

# 2. 忽略大小写:查找文件名中包含 test 的文件
find /path/to/dir -iname "*test*"

# 3. 按类型查找:查找当前目录下所有目录
find . -type d

# 4. 按大小查找:找出大于 10MB 的文件
find . -size +10M

# 5. 按时间查找:查找最近 7 天修改过的文件
find . -mtime -7

# 6. 结合操作:查找 .log 文件并删除
find . -name "*.log" -exec rm {} \;

小总结:

  • 按文件名:-name-iname 匹配文件名(-iname 忽略大小写)。
  • 按类型:-type 筛选类型(d 目录,f 文件)。
  • 按大小:-size 精确筛选文件大小。
  • 按时间:-mtime 找最近修改的文件。
  • 结合操作:-exec 对结果执行操作,比如删除或移动文件。

find 是命令行下的文件管理利器,搜索与操作一气呵成!

38.sed:文本处理小能手(初学者可以先跳过,有需要再来看)

“批量修改文件、替换文本内容,用它效率倍增!”

用法:sed [选项] '命令' 文件

  • 强大的流式编辑器,支持查找、替换、删除、插入等操作,适用于文本处理和自动化脚本。

常用操作:

# 1. 查找并替换:将文件中所有的 "old" 替换为 "new"
sed 's/old/new/g' file.txt

# 2. 只显示替换后的结果,不修改原文件
sed 's/old/new/g' file.txt

# 3. 直接修改文件(加 -i)
sed -i 's/old/new/g' file.txt

# 4. 删除包含 "unwanted" 的行
sed '/unwanted/d' file.txt

# 5. 显示文件的特定行(如第 5 行)
sed -n '5p' file.txt

# 6. 批量插入内容:在文件每一行后添加 "END"
sed 's/$/ END/' file.txt

小总结:

  • 查找替换:s/old/new/g 替换文本内容。
  • 直接修改:-i 参数直接修改文件内容。
  • 删除行:/pattern/d 删除匹配的行。
  • 插入内容:s/$/ 内容/ 在每行末尾添加内容。

sed 是命令行下的文本处理神器,快速、强大、灵活!

39.awk:文本分析小能手(初学者可以先跳过,有需要再来看)

“从数据中提取你想要的信息,用它事半功倍!”

用法:awk '条件 { 动作 }' 文件

  • 适合处理结构化文本,如日志、CSV 文件,支持模式匹配、字段操作、条件过滤等。

常用操作:

# 1. 打印每行的第 1 列和第 3 列
awk '{print $1, $3}' file.txt

# 2. 打印包含关键字 "error" 的行
awk '/error/ {print}' file.txt

# 3. 条件过滤:打印第 3 列值大于 100 的行
awk '$3 > 100 {print}' file.txt

# 4. 在输出中添加分隔符(如逗号)
awk '{print $1 "," $2}' file.txt

# 5. 统计行数
awk 'END {print NR}' file.txt

# 6. 处理 CSV 文件:打印第 2 列
awk -F ',' '{print $2}' file.csv

# 7. 计算列总和:统计第 3 列的总和
awk '{sum += $3} END {print sum}' file.txt

小总结:

1、字段操作:$1, $2, $3 表示第 1、2、3 列。

2、条件过滤:/pattern/ 或条件语句(如 $3 > 100)。

3、自定义分隔符:-F 指定分隔符(如 -F ',' 处理 CSV 文件)。

4、内置变量:

  • NR:行号。
  • NF:字段数。
  • $0:整行内容。

awk 是文本处理的瑞士军刀,数据提取与分析的利器!

40.wc:统计文件信息

“想知道文件有多少行、多少单词?它帮你算清楚!”

用法:wc [参数] 文件名

常用参数:

  • -l:统计行数
wc -l file.txt

显示文件的总行数。

  • -w:统计单词数
wc -w file.txt

统计文件中有多少个单词。

wc 的几个参数简单又实用,-l 数行,-w 数单词,轻松掌握文件的基本信息!

第四部分:权限管理,安全至上

41.chmod:修改文件权限

“想让文件可读、可写、可执行?用它调整权限!”

用法:chmod [选项] 权限 文件

  • 修改文件或目录的权限,适用于设置读取、写入、执行权限。

常用操作

# 1. 将文件设为所有人可读(r),所有者可写(w),所有人可执行(x)
chmod 755 script.sh

# 2. 只允许所有者读写,其他人无权限
chmod 600 secret.txt

# 3. 为目录添加执行权限(递归应用到子目录和文件)
chmod -R +x /path/to/directory

# 4. 使用符号模式添加权限:为文件添加所有用户的执行权限
chmod +x script.sh

# 5. 移除权限:移除文件的写权限
chmod -w readonly.txt

# 6. 为用户组添加写权限
chmod g+w shared_file.txt

# 7. 设置文件的详细权限:为不同用户分配精确权限
chmod u=rwx,g=rx,o= script.sh

# 7说明:
# u=rwx:文件所有者 (u) 有读 (r)、写 (w)、执行 (x) 权限。
# g=rx:文件所在的用户组 (g) 有读 (r)、执行 (x) 权限,没有写权限。
# o=:其他用户 (o) 无任何权限。
# 适用场景:
# 1. 让文件所有者可以完全操作文件。
# 2. 组用户只能查看和运行文件。
# 3. 防止其他用户访问文件内容。

小总结:

  • 数字模式: 快速设置权限,比如 chmod 755
  • 符号模式: 灵活添加或移除权限,比如 chmod +x
  • 递归操作:-R 修改目录及其子目录权限。
  • 权限拆解:4,写 2,执行 1,组合成总权限。

chmod 是管理文件权限的必备工具,轻松保护文件安全!

[root@MyLinux01 ~]# ls -l
总用量 4
-rw-r--r-- 1 root root  38 11月 22 15:45 pas.txt
drwxr-xr-x 3 root root 123 11月 22 14:06 script

# 1.文件类型与权限 Access Privilege
    d         rwx       r-x        r-x
   类型     文件所属用户 文件所属组   其他用户的权限
    r : read    4
    w : write   2
    x : execute 1
    - : nono    0

    s : x 在执行程序时让其他用户临时拥有所有者或所属组的权限
    S : 大S 没有可执行权限时,强制给文件加s权限,表示添加失败

    t : 粘滞位 给目录的权限,在本目录下不能删除其他人的文件
    T : 目录其他人的权限没有x时,强行加t,表示添加失败的


567  r-x rw- rwx
654  rw- r-x r--
-w-  --x r--  214

755  -rwxr-xr-x
644  -rw-r--r--
600  -rw-------
777  -rwxrwxrwx

# 2.硬链接的次数   Links   inode 节点
# 3.文件属于的用户(属主)  Uid (User Name) 
# 4.文件属于的用户组(属组) Gid (Group Name)
# 5.文件的大小 Size
# 6.修改时间   Modify
# 7.文件名     File
stat -c %A ppp.txt   # 仅查看文件的权限
  • 字母修改法
  • u(user) g(group) o(other) a(all)
  • chmod +x a.sh
  • chmod u=rwx,g=rx,o=r a.sh
  • 数字修改法
  • chmod 666 a.sh
  • 0000 ~ 7777
  • 特殊权限:1--t 2--sgid 3--同时加t和sgit 4--suid
权限 文件 目录
r 查看文件的内容 可以使用ls命令查看目录下的内容
w 添加.修改.删除文件中的内容 创建.移动.复制.改名.删除文件
x 执行权限 cd 到目录的权限,进入目录
t ----------------------------------------- 防止其他用户删除非自己的文件
s suid/sgid 其他用户在执行命令时,拥有属主或属组的权限 --------------------------------------------

42.chown:修改文件所有者

“文件是谁的?用它改!”

用法:chown [选项] 用户名:组名 文件名

  • 修改文件的所有者和所属组。

常用操作:

# 1. 修改文件所有者为 user1,组保持不变
sudo chown user1 file.txt

# 2. 修改文件所有者为 user1,组为 group1
sudo chown user1:group1 file.txt

# 3. 递归修改目录及其所有文件的所有者。 -R:代表递归
sudo chown -R user1:group1 /path/to/directory 

小总结:

  • 改所有者:sudo chown 用户名 文件名
  • 改组:用户名:组名 组合方式。
  • 改目录及子文件:-R 递归修改。

chown,文件权限管理更灵活!

43.chgrp:修改文件所属组

“想改变文件的所属组?用它搞定!”

用法:chgrp [选项] 组名 文件名

  • chgrp专注于修改文件或目录的所属组,不影响文件的所有者。

常用操作

# 1. 修改文件的所属组为 group1
sudo chgrp group1 file.txt

# 2. 递归修改目录及其所有文件的所属组
sudo chgrp -R group1 /path/to/directory

# 适用场景:
# 1. 改变文件的组归属,例如分配给新团队或用户组。
# 2. 与 chown 搭配使用,灵活调整文件权限。

小总结

  • 改组:用 sudo chgrp 组名 文件名
  • 改目录及子文件组:加 -R 递归修改。

chownchmod区别:

功能点 chgrp chown
修改所有者 ✖ 不支持 ✔ 支持
修改所属组 ✔ 支持 ✔ 支持
同时修改两者 ✖ 不支持 ✔ 支持(chown owner:group
语法简洁性 仅涉及组的修改,语法更简单 功能更强大,但语法稍复杂

44.sudo:以管理员身份执行命令

“需要管理员权限?用它搞定!”

用法:sudo 命令

示例:

sudo apt update

使用管理员权限更新软件包列表。

注意: 执行 sudo 时,可能会提示输入用户密码。输入后即可运行带管理员权限的命令。

第五部分:用户管理,系统小管家

三类用户:

  • root 超级管理员 UID 0
  • 普通用户 UID 1000以后的用户
  • 程序用户 1~500 (不能登陆系统) 用于启动程序.管理进程.配置文件与数据的用户。
vim /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

x:是否使用密码才能登陆
#用户名:x:uid:gid:全名:用户家目录:用户的默认shell

......
zj:x:1000:1000::/home/zj:/bin/bash
zz:x:1001:1001::/home/zz:/bin/bash
# 手动创建组
vim /etc/group
##########################
bbb:x:1003:
##########################
# 手动创建用户
vim /etc/passwd
##########################
bbb:x:1003:1003::/home/bbb:/bin/bash
#########################
## 创建用户家目录
mkdir /home/bbb 
## 复制默认配置文件到用户家目录
cp  /etc/skel/.*  /home/bbb
## 将家目录的用户和组改为新用户
chown  bbb.组名  -R /home/bbb
## 给新用户创建密码
passwd bbb
## 登陆新用户
su - bbb

45.adduser/useradd:添加用户

“想给系统加个新用户?用它!”

用法:sudo adduser 用户名

示例:

sudo adduser john

按照提示设置密码和用户信息,john 用户就添加好了!

adduser 还会帮你自动创建主目录,非常贴心。

46.deluser/userdel:删除用户

“不用的账号?删掉它!”

用法:sudo deluser 用户名

示例:

sudo deluser john

删除用户 john,但不会删除他的主目录。

小结:

  • 添加用户:adduser
  • 删除用户:deluser

简单高效,轻松管理系统用户!

47.passwd:修改用户密码

“想改密码?用它!”

用法:passwd : 直接更改当前用户的密码。

  • 如果修改其他用户密码,加上 sudo
sudo passwd 用户名

用管理员权限为指定用户设置新密码。

48.id:谁的权限最大?

“看看自己是普通员工还是管理员。”

用法:id

  • 显示 UID(用户 ID)和 GID(组 ID)。

常用操作:

  • 查看当前用户的信息:
id

显示当前用户的 UID(用户 ID)、GID(组 ID)以及所属的组。

  • 查看指定用户的信息:
id username

显示 username 的用户 ID 和权限组信息。

id 是快速查看用户 ID 和权限组的工具,简单实用!

49.whoamiwhow:谁在线?

“看看都有哪些人登录了系统。”

  • whoami: 简单显示登录用户。
  • who:显示所有登录到系统的用户 。
  • w:不仅显示用户,还显示他们在做什么。

第六部分:归档与压缩命令,数据收纳大师

50.tar:打包与解包神器

“想把文件打包或解压?用它就对了!”

常用参数

参数 作用
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用Gzip压缩或解压
-j 用bzip2压缩或解压 -J 使用xz压缩或解压缩
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录

用法:

  • 打包:tar -cvf archive.tar 文件/目录
  • 解包:tar -xvf archive.tar

比如:

# -c:创建打包文件
tar -cvf my_files.tar file1 file2  

这会把 file1file2 打包成一个文件。

要想压缩得更小,还可以用 -z

# -z:使用 gzip 压缩
tar -czvf my_files.tar.gz file1 file2 

-z 表示压缩成 gzip 格式。

解压缩同样简单:

# -x:解压文件
tar -xzvf my_files.tar.gz  

小结:

  • 打包:tar -cvf
  • 压缩:tar -czvf
  • 解压:tar -xzvf

tar,Linux 文件管理方便又高效!

51.zipunzip:轻松压缩与解压

“压缩和解压 zip 文件的工具。”

用法:

  • 压缩:
zip archive.zip 文件/目录

将 文件或者目录 压缩为 archive.zip,压缩目录需要加上 -r 参数。

  • 解压:
unzip archive.zip

更适合和 Windows 用户一起合作,因为大家都熟悉 zip 格式。

52.gzipgunzip:快速压缩与解压

“只压缩或解压单个文件?用它最方便!”

gzip:压缩文件

用法:gzip 文件名

常用操作:

  • 压缩单个文件:
gzip file.txt
  • 压缩后生成 file.txt.gz,原文件会被替换。

  • 保留原文件,生成压缩文件:

gzip -k file.txt
  • -k:保留原文件,压缩结果为 file.txt.gz

gunzip:解压文件

用法:gunzip 文件名.gz

常用操作:

  • 解压文件:
gunzip file.txt.gz
  • 解压后恢复为 file.txt

  • 保留压缩文件,解压内容:

gunzip -k file.txt.gz
  • -k:保留原压缩文件,同时生成解压后的文件。

小结:

  • 压缩:gzip,加 -k 保留原文件。
  • 解压:gunzip,加 -k 保留压缩文件。

适合快速操作单个文件!

第七部分:磁盘和设备管理,硬盘健康助手

53.mountumount:挂载与卸载

“插 U 盘后,告诉系统‘这是我的盘’,用完后再安全移除!”

mount:挂载设备

用法:mount [设备路径] [挂载点]

  • 设备路径:指设备在系统中的地址,比如 /dev/sdb1(U 盘或硬盘分区)。
  • 挂载点:指定一个目录,比如 /mnt,用来访问设备中的内容。

例子:挂载 U 盘

sudo mount /dev/sdb1 /mnt
  • /dev/sdb1:系统分配给 U 盘的路径,相当于设备的“接口”。
  • /mnt:挂载点,相当于给设备一个“访问入口”,可以用来打开 U 盘的内容。

umount:卸载设备

用法:umount [挂载点或设备路径]

例子:卸载设备

sudo umount /mnt
  • 卸载挂载点 /mnt,断开设备和系统的连接。
  • 卸载前确保设备中的文件没有被占用。

小结:

  • 挂载:sudo mount /dev/sdb1 /mnt,告诉系统“从这里访问设备”。
  • 卸载:sudo umount /mnt,用完后“安全移除”。

简单两步,就能管理 U 盘或其他存储设备!

开机自动挂载

vim /etc/fstab 

#############################
# 设备名或设备的uuid     # 挂载点            # 文件系统类型    # 挂载模式   # 备份  # 检测
/dev/cdrom             /media/cdrom         iso9660         ro           0       0
#############################

54.fsck:文件系统检查与修复工具

“硬盘出问题了?用它检查修复!”

用法:fsck [选项] [设备路径]

用于检查和修复 Linux 文件系统错误的工具。

  • 设备路径:指需要检查的分区,比如 /dev/sda1
  • 选项:控制检查和修复行为。比如:-y-n-f

常用操作

# 1. 检查并修复分区
sudo fsck /dev/sda1

# 2. 强制检查,即使文件系统被认为是干净的
sudo fsck -f /dev/sda1

# 3. 仅检查问题,不进行修复(安全查看用)
sudo fsck -n /dev/sda1

# 4. 自动修复所有问题,不需要逐一确认
sudo fsck -y /dev/sda1

检查并修复文件系统的错误,特别是硬盘在非正常关机后。总之fsck 是文件系统的急救工具,硬盘有问题时必备!

55.lsblk:查看磁盘及分区信息

“想知道系统里有几块硬盘、几块分区?用它一目了然!”

用法:lsblk 选项

  • 会清晰地列出所有存储设备及分区信息,包括大小和挂载点。

lsblk 常用参数示例:

# 1. 显示所有设备,包括未挂载的设备
lsblk -a

# 2. 只显示挂载点及文件系统信息
lsblk -f

lsblk 是查看系统磁盘和分区结构的利器,轻松了解设备大小、分区类型和挂载点!

第八部分:系统管理,了解机器

56.hostname:查看或设置主机名

“想知道机器的名字?或者改成自己喜欢的名字?用hostname!”

常用操作示例

# 1. 查看主机名
hostname

# 2. 临时设置主机名(重启后失效)
sudo hostname new-hostname

# 3. 永久设置主机名
sudo hostnamectl set-hostname new-hostname

hostname 查看或临时设置主机名,用 hostnamectl 永久更改主机名,管理主机名就是这么简单!

57.uname:显示系统信息

“想知道系统的类型和版本?用它!”

用法:uname [选项]

常用操作示例:

# 1. 查看系统的基本信息
uname

# 2. 查看详细系统信息(内核版本、架构等)
uname -a

# 3. 查看内核名称(如 Linux)
uname -s

# 4. 查看内核版本
uname -r

# 5. 查看系统架构(如 x86_64)
uname -m

小总结:

  • 简单查看:unameuname -a 查看系统和内核信息。
  • 细节查询:-s 查看内核名称,-r 查版本,-m 查架构。

uname 是快速了解系统环境的基础工具!

58.top:系统任务管理器

“系统卡顿了?用它看看是哪个进程占资源。”

用法:top, 按 q 键退出

  • 实时查看系统的 CPU 和内存占用情况。

常用操作:

  • P:按 CPU 使用率排序。
  • M:按内存占用排序。

top 是系统性能的监控利器,学会用 PM 排序,排查问题快又准!

59.ps:查看进程

“系统里有什么进程在跑?一查便知!”

用法:ps [选项]

  • 列出所有运行的进程,包括用户、资源占用、启动命令等信息。

常用操作:

# 1. 查看所有进程(标准输出)
ps aux

# 2. 搜索特定进程,结合 grep,快速定位特定进程。
ps aux | grep 进程名
ps -aux 或者ps -ef 

#用户        进程号 cpu利用率 内存使用率   虚拟内存  占用的固定内存  终端  运行状态 启动时间 占用CPU的时间 命令
USER        PID   %CPU       %MEM        VSZ       RSS       TTY    STAT   START   TIME       COMMAND
root          1   0.5         0.2       125868     4316        ?     Ss    15:23   0:02      /usr/lib/sys
root          2   0.0         0.0        0          0          ?      S    15:23   0:00      [kthreadd]
root          3   0.1         0.0        0          0          ?      S    15:23   0:00      [ksoftirqd/0

### 查看程序是否在运行
ps -aux |grep "程序名"

小总结ps aux 是查看当前系统所有进程的基础命令,配合 grep 查找特定进程,简单又实用!

60.kill:手动结束进程

“系统卡住了?用它强制关掉卡死的进程!”

用法:kill 进程号

  • 找到进程号 (PID),用 kill 结束它。

常用操作:

  • 结束指定进程:
kill 12345

这里的 12345 是进程号 (PID),该命令会杀掉进程号为 12345 的进程。

  • 强制结束进程:当进程拒绝退出时,可以用 -9 强制终止:
kill -9 12345
  • 结合 ps 查找并结束进程(常用)
ps aux | grep 进程名
kill 进程号

通过 ps aux 找到目标进程的 PID,再用 kill 结束它。

小总结kill 是结束卡死或无响应进程的利器。先用 ps aux 定位进程号,再用 kill 轻松解决问题。如果进程顽固不退,加 -9 一击必杀!

61.free:内存够用吗?

“看看内存的分配情况。”

用法:free [选项]

  • 显示系统内存的使用情况,包括总内存、已用内存、空闲内存和缓冲/缓存。

常用操作示例:

# 1. 查看内存使用情况(以 KB 为单位,默认)
free

# 2. 以人类可读的格式显示内存(MB/GB)
free -h

# 3. 持续监控内存变化(每秒刷新一次)
free -s 1

free 是查看系统内存使用情况的利器,配合 -h 参数更直观,用 -s 持续刷新监控更方便!

62.dfdu:查看磁盘使用情况

“磁盘够用吗?用它们看看就知道!”

df:磁盘空间概览

“想知道磁盘空间还剩多少?用它一目了然!”

用法:df [选项]

  • 显示文件系统的磁盘使用情况,包括总空间、已用空间、可用空间和挂载点。

常用操作示例:

# 1. 查看所有文件系统的磁盘使用情况(以 KB 为单位,默认)
df

# 2. 以人类可读格式显示磁盘使用情况(MB/GB)
df -h

# 3. 显示特定目录的磁盘使用情况
df -h /path/to/directory
df 是查看磁盘分区整体使用情况的必备工具,配合 -h 参数更直观易读。

du:文件/目录空间占用

“想知道某个目录占了多少空间?用它精确分析!”

用法:du [选项] [路径]

  • 显示指定文件或目录的空间使用情况,支持递归统计。

常用操作示例:

# 1. 查看当前目录下每个文件和子目录的大小
du

# 2. 以人类可读格式显示文件和目录大小
du -h

# 3. 查看当前目录的总大小
du -sh

# 4. 显示指定目录下每个文件的大小
du -h /path/to/directory

du 是精准查看目录和文件空间占用的好帮手,配合 -h 参数更清晰,用 -s 快速查看总大小!

小总结

  • df:查看磁盘分区总览,关注整体使用情况。
  • du:查看目录或文件的具体占用,适合精准分析。

两者结合使用,磁盘空间管理更高效!

第九部分:网络操作,玩转连接

63.ping :测试网络连通性

“网络通不通?用它试一试!”

用法:ping [选项] 目标地址

  • 向目标地址发送 ICMP 数据包,测试网络的连通性和延迟。
# 1. 测试目标地址的连通性(默认持续发送数据包)
ping www.google.com  -- 这个最常用

# 2. 指定发送的次数(比如发送 5 次)
ping -c 5 www.google.com

# 3. 限制每次发送数据包的间隔时间(1 秒间隔)
ping -i 1 www.google.com

# 4. 调整数据包大小(默认 56 字节)
ping -s 128 www.google.com

# 5. 不解析 IP 对应的主机名(加速测试)
ping -n www.google.com

小总结:

  • 基本连通性测试:ping 检查目标是否在线。
  • 控制发送次数:-c 设定发送包数量。
  • 网络性能调试:-s-i 调整包大小和发送频率。

ping 是网络排查的基础工具,用 ping 测试目标是否在线、网络是否稳定,简单又高效!

64.traceroute:路由追踪工具

“想知道数据包经过哪些节点到达目标?用它一查便知!”

用法:traceroute [选项] 目标地址

  • 跟踪网络数据包从本地主机到目标主机的路径,显示经过的中间路由节点。(各个节点的 ip 地址)
# 1. 追踪到目标主机的路由节点,显示数据包到目标主机的所有中间节点地址及响应时间。
traceroute example.com  -- 这个最常用

# 2. 限制显示的最大跳数(默认是 30)
traceroute -m 20 example.com

# 3. 指定每跳的探测次数(默认是 3 次)
traceroute -q 1 example.com

# 4. 使用 ICMP 协议代替 UDP 进行路由追踪(部分网络更友好)
traceroute -I example.com

# 5. 使用指定端口进行路由追踪
traceroute -p 443 example.com

小总结:

  • 基本路由追踪:traceroute 查看节点路径。
  • 限制跳数:-m 避免输出过多节点。
  • 协议选择:-I 兼容更多网络环境。

traceroute 是网络调试的利器,快速定位网络延迟或中断的节点!

65.wget:文件下载工具

“轻松从网络下载文件,稳定又高效!”

用法:wget [选项] URL

  • 用于从指定 URL 下载文件,支持断点续传、批量下载等功能。

例如下载文件:

# 1. 下载单个文件
wget http://example.com/file.zip

# 2. 下载并保存为指定文件名
wget -O newname.zip http://example.com/file.zip

# 3. 断点续传未完成的下载
wget -c http://example.com/largefile.zip

# 4. 下载需要认证的文件(提供用户名和密码)
wget --user=username --password=password http://example.com/securefile.zip

# 5. 限制下载速度(每秒 100KB)
wget --limit-rate=100k http://example.com/largefile.zip

小总结:

  • 单个文件下载:wget URL 简单高效。
  • 断点续传:-c 续传未完成的文件下载。
  • 下载限制:--limit-rate 控制下载速度。

wget 是命令行中的万能下载器,下载稳定、功能强大,非常适合文件和网站资源获取!

66.curl:万能数据获取工具

“不仅能下载文件,还能调接口、获取网页数据!”

用法:curl 选项 [网址]

  • 支持 HTTP、HTTPS、FTP 等多种协议。

常用操作:

# 1. 下载文件
curl -O http://example.com/file.zip

# 2. 保存文件为指定名称
curl -o newname.zip http://example.com/file.zip

# 3. 查看网页内容
curl http://example.com

# 4. 调用接口(GET 请求)
curl -X GET http://api.example.com/data   # -X:指定请求方法(GET、POST、DELETE 等)

# 5. 调用接口(POST 请求并发送数据)
curl -X POST -d "key=value" http://api.example.com/data

# 6. 显示详细的请求和响应过程
curl -v http://example.com

小总结:

  • 下载文件:curl -Ocurl -o
  • 调试接口:-X 指定方法,结合 -d 发送数据。
  • 查看详细过程:-v 显示请求和响应细节。

curl 是命令行下的网络多面手,下载与调试两不误!

76.telnet:测试端口连通性

“目标端口能不能通?用它试一试!”

用法:telnet 主机名或IP 端口号

  • 测试目标主机的指定端口是否开放,检查网络服务连通性。

例如:

telnet www.baidu.com 80

# 说明:
# - 如果连接成功,显示 "Connected to ..."。
# - 如果失败,显示 "Connection refused" 或 "Unable to connect"。

这会测试百度的 HTTP 服务(80 端口)是否可以连接。

常用场景:

  • 测试服务器的特定服务是否正常运行。
  • 检查防火墙是否阻止了指定端口。

telnet 是测试端口连通的常用工具,用它快速判断目标端口是否开放,网络排查简单又直观!

68.netstat:网络连接一览

“想知道系统有哪些网络连接?用它快速查看!”

用法:netstat [选项]

  • 列出当前网络连接、端口监听状态、统计信息等。

常用操作示例:

# 1. 查看所有网络连接
netstat -a

# 2. 查看监听的 TCP 和 UDP 端口
netstat -nlptu
# -t:仅显示 TCP 连接。
# -l:仅显示正在监听的端口。
# -n:以数字格式显示地址和端口。
# -p:显示占用端口的进程。
# -u:仅显示 UDP 连接

# 3. 查看指定端口的连接情况(结合 grep 筛选)
netstat -tlnp | grep :80    # 这种非常常用!!

# 4. 通过进程名,筛选出由特定程序或服务占用的连接(也常用!)
netstat -tlnp | grep nginx    # 查看 Nginx 占用的连接

# 5.筛选出特定连接状态(例如 LISTEN 或 ESTABLISHED):
netstat -tlnp | grep LISTEN       # 查看所有监听的端口
netstat -tlnp | grep ESTABLISHED  # 查看所有已建立的连接

netstat 配合参数和过滤器 grep,网络调试更高效!

小总结:

  • 监听端口:-tlnp 查看监听的服务和进程。
  • 筛选连接: 配合 grep 过滤指定端口或进程。

虽然现在很多场景推荐用 ss 替代 netstat,但 netstat 依然是经典的网络调试工具,简单好用!

69.ss:现代网络连接查看工具

“想替代 netstat?用它更快更强大!”

用法:ss [选项]

  • ssnetstat 的现代替代工具,用于显示网络连接、监听端口、统计信息等,性能更高,输出更快。

常用操作:

# ss 常用操作示例:

# 1. 显示所有网络连接
ss -a

# 2. 显示所有监听的 TCP 和 UDP 端口
ss -nlptu
# -t:仅显示 TCP 连接
# -u:仅显示 UDP 连接
# -l:仅显示监听连接
# -n:不解析主机名和服务名称,显示数字地址和端口号(加速)。
# -p:显示占用端口的进程。


# 3. 查看 ESTABLISHED 状态的连接
ss -t state established

# 4. 查看指定端口的连接(结合 grep 过滤)
ss -tlnp | grep :80  # 按端口号过滤

# 5. 查看所有包含某个 IP 地址的连接
ss -tlnp | grep '192.168.1.100'  # 按 IP 地址过滤

# 7. 查看某个进程(根据 PID)
ss -tulnp | grep '1234'  # 根据进程 ID (PID) 过滤

# 8. 查看某个协议类型的连接
ss -tuln | grep 'tcp'  # 按协议类型(如 tcp)过滤

# 9. 查看网络连接的具体服务
ss -tulnp | grep 'nginx'  # 根据服务名称过滤(例如:nginx)

ssnetstat 的对比

功能 ss netstat
性能 快,直接从内核获取数据 慢,需读取 /proc 文件
默认安装 新版 Linux 默认安装 逐渐被淘汰,不再维护
支持状态过滤 更强,支持精准筛选 支持但不够灵活
推荐使用

总结:

  • 查看监听端口:ss -tuln
  • 定位特定端口:ss -tuln | grep 端口号
  • 显示进程和端口:ss -tulnp | grep 端口号

ss 是现代网络管理的必备工具,比 netstat 更快、更强大!

70.tcpdump:网络数据包捕获工具

“想知道网络中发生了什么?用它抓包分析!”

用法:tcpdump [选项] [过滤条件]

  • 强大的网络抓包工具,支持实时查看或保存数据包,用于分析网络问题。

常用操作:

# tcpdump 常用选项:
# -i:指定监听的网络接口(如 eth0)。
# -w:将捕获的数据包保存到文件(如 capture.pcap)。
# -r:从文件中读取并解析数据包(如读取保存的 pcap 文件)。
# -n:不解析主机名和服务名称,直接显示 IP 和端口号。
# -nn:同时禁用主机名和端口解析,显示数字地址和端口号。
# -c:限制捕获的数据包数量(如 -c 10 表示捕获 10 个包后退出)。
# -X:显示数据包的十六进制和 ASCII 内容。
# -A:以 ASCII 格式显示数据包内容(适合查看 HTTP 数据)。
# -v:显示数据包的详细信息

# 1. 捕获指定接口上的所有数据包
tcpdump -i eth0

# 2. 捕获并保存数据包到文件
tcpdump -i eth0 -w capture.pcap

# 3. 捕获来自特定 IP 的数据包
tcpdump -i eth0 src 192.168.1.100

# 4. 捕获目标 IP 的数据包
tcpdump -i eth0 dst 192.168.1.200

# 5. 捕获特定端口(如 80)上的流量
tcpdump -i eth0 port 80

# 6. 捕获来自特定源 IP 且目标端口为 80 的数据包,并保存到文件 capture.pcap 里
tcpdump -i eth0 src 192.168.1.100 and dst port 80 -w capture.pcap -nn -v # 比较常用!

小总结:

  • 抓取数据包:tcpdump -i 接口 监听网络流量。
  • 保存数据分析:-w 保存为文件,配合 Wireshark 等工具分析。
  • 过滤特定流量: 配合 srcdstport 筛选数据包。
  • 查看详细信息:-v 或更详细的 -vv 输出抓包细节。

tcpdump 是网络调试和分析的利器,实时抓包、高效诊断,让网络问题无处遁形!

71.nc (Netcat):网络工具的瑞士军刀

“不仅能测试端口,还能传文件、模拟服务,样样精通!”

用法:nc 选项 [主机名或IP] [端口号]

  • 支持 TCP 和 UDP 协议,用于网络调试、文件传输、服务模拟等。

常用操作:

# nc 常用选项:
# -l     :监听模式,用于在本地创建服务器,等待客户端连接。
# -z     :扫描模式,检查端口是否开放,不发送任何数据。
# -v     :启用详细模式,输出更多的调试信息。
# -u     :使用 UDP 协议进行连接,而不是默认的 TCP。
# -p     :指定源端口。
# -w     :设置超时时间,单位为秒。
# -n     :禁用 DNS 解析,直接使用 IP 地址,而不是域名。
# -v     :详细输出,显示连接过程中的所有信息。


# 1. 连接到远程主机的指定端口(TCP连接)
nc example.com 80

# 2. 监听本地端口(创建服务器,等待连接)
nc -l 12345

# 3. 通过 netcat 发送文件到远程主机
# 在远程机器上执行:nc -l 12345 > received_file.txt
# 在本地机器上执行:nc remote_host 12345 < file_to_send.txt

# 4. 使用 UDP 协议发送数据
nc -u -l 12345  # 监听 UDP 端口 12345
nc -u remote_host 12345  # 发送数据到指定 UDP 端口

# 5. 测试端口是否开放(可以用来检查某些端口是否能够连接)
nc -zv example.com 80 443

# 6. 扫描端口范围(测试哪些端口开放)
nc -zv example.com 1-1000

# 7. 通过 nc 实现简易的端到端聊天
# 在一台机器上执行:nc -l 12345
# 在另一台机器上执行:nc localhost 12345
# 然后你就可以发送消息了

# 8. 创建一个简单的 HTTP 请求
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

# 9. 发送数据并接收响应
echo "Hello, World!" | nc example.com 80

小总结:

  • 测试端口:-zv 查看目标主机端口是否开放。
  • 文件传输: 配合 -l 模式,简单实现发送和接收。
  • 模拟客户端: 手动发送请求,调试服务(如 HTTP)。

nc 是命令行下的网络全能工具,调试与传输样样行!

72.lsof:查看文件和网络连接的多面手

“文件被谁占用?哪个进程占用端口?用它快速搞定!”

用法:lsof [选项]

  • 默认列出系统中所有打开的文件和连接,包括网络套接字。

lsof 的两大核心功能:

  1. 文件占用: 查看文件或设备被哪些进程使用。
  2. 网络连接: 检查端口、IP 和服务状态。

网络相关:重头戏

常用操作:

# 查看所有网络连接
lsof -i

# 查看特定端口的占用情况
lsof -i :80

# 显示详细网络连接(数字端口和 IP 地址)
lsof -Pni

# 显示被特定端口(如 80)占用的进程及其详细信息。
lsof -Pni :80

# 结合 grep 筛选出监听状态的端口
lsof -Pni | grep LISTEN

# 筛选出与某个 IP 地址相关的连接(本地或远程)
lsof -Pni | grep 192.168.1.100

# 查找指定进程的网络连接,PID代表进程号
lsof -Pni | grep <PID>

文件相关操作:核心功能

# 查看文件被哪些进程占用
lsof /path/to/file

# 查看某用户打开的所有文件
lsof -u username

# 查看某进程打开的文件,PID代表进程号
lsof -p <PID>

特点:

  • 灵活强大: 不论是文件占用还是网络连接,lsof 都能快速定位问题。
  • 配合 grep: 在网络场景下,结合 grep 可快速筛选监听状态或特定端口的连接。

小总结:

  • 网络调试:lsof -Pni 查看详细连接信息,配合 grep LISTEN 排查监听端口。
  • 文件调试:lsof 文件路径lsof -p PID 查看文件占用情况。

lsof 是网络和文件调试的多面手,尤其适合端口和连接问题的排查!

73.ip:查看和管理网络配置

“网络连接有问题?用它查看或配置 IP 和路由!”

用法:ip [命令] [选项]

常用操作:

# 1. 查看网络接口信息(类似 ifconfig)
ip addr show

# 2. 查看路由表
ip route show

# 3. 启用网络接口
sudo ip link set eth0 up

# 4. 禁用网络接口
sudo ip link set eth0 down

ip 是强大的网络管理工具,配合 addrroutelink 子命令,轻松查看和配置网络接口!

74.ssh:远程登录工具

“想远程控制服务器?用它轻松连接!”

用法:ssh [选项] 用户名@主机地址

  • 通过 SSH 协议远程登录到目标主机,进行管理或操作。

常用操作:

# 1. 登录远程主机
ssh user@remote_host       # remote_host 代表目标 ip,user 代表用户名

# 2. 指定端口登录,使用 -p 参数
ssh -p 2222 user@remote_host

# 3. 使用指定私钥文件登录
ssh -i /path/to/private_key user@remote_host

# 4. 执行远程命令后退出 
ssh user@remote_host "ls -l /home"

小总结:

  • 远程登录:ssh user@host
  • 指定端口或私钥:-p-i。 用 ssh,远程操作安全又方便!

62.scp:远程拷贝文件

“想在两台机器之间传文件?用它!”

用法:scp [选项] 源路径 目标路径

  • scp 基于 SSH 传输,支持安全、快速的文件拷贝。

常用操作:

# 1. 从本地传文件到远程
scp file.txt username@remote_host:/path/to/destination

# 2. 从远程下载文件到本地
scp username@remote_host:/path/to/file.txt /local/path/

# 3. 传输整个目录(加 -r 参数 : 递归传输目录)
scp -r /local/folder username@remote_host:/remote/folder

# 4. -P:指定远程主机的 SSH 端口(默认 22)
scp -P 8000 file.txt username@remote_host:/remote/path

scp 是远程传输文件的简单工具,配合 -r 传目录,配合 -P 指定端口,方便高效!

75.rsync:高效文件同步工具

“想同步文件或目录?用它快又稳!”

用法:rsync [选项] 源路径 目标路径

  • rsync 支持增量传输,只同步变化的部分,比 scp 更高效。

常用操作:

# rsync常用选项参数:
# -a:归档模式,保留文件权限、时间戳等信息。
# -v:显示详细信息。
# --delete:删除目标中源目录不存在的文件。
# -e:指定远程传输方式(如 SSH)。

# 1. 同步本地目录到远程
rsync -av /local/dir username@remote_host:/remote/dir

# 2. 从远程目录同步到本地
rsync -av username@remote_host:/remote/dir /local/dir

# 3. 同步时删除目标中多余的文件
rsync -av --delete /local/dir username@remote_host:/remote/dir

# 4. 使用 SSH 指定端口
rsync -av -e "ssh -p 2222" /local/dir username@remote_host:/remote/dir

优点:

  • 增量同步: 只传输修改过的部分,提高效率。
  • 多功能: 支持本地与远程同步,适合大规模文件传输。

rsync 是同步文件和目录的利器,结合 -a 保留信息,--delete 清理目标,多场景传输轻松搞定!

第十部分:日志和系统调试,系统探长

76.strace:系统调用调试工具

“程序卡住了?用它看看系统调用的细节!”

用法:strace [选项] 命令

  • 跟踪指定命令运行时的系统调用和信号。
  • 常用于调试程序错误或分析程序行为。

常用操作:

# 1. 跟踪一个命令的系统调用
strace ls

# 2. 将跟踪输出保存到文件
strace -o trace.log ls

# 3. 仅跟踪文件相关的系统调用
strace -e trace=file ls

# 4. 跟踪指定进程的系统调用, PID代表进程号
strace -p <PID>

# 5. 显示系统调用的时间消耗
strace -T ls

常用选项:

  • -o 文件名:将输出保存到文件。
  • -e trace=file:仅跟踪文件相关的调用(如 openread 等)。
  • -p PID:跟踪已有进程。
  • -T:显示每个系统调用的耗时。

小总结:

  • 跟踪命令:strace 命令 观察其行为。
  • 跟踪进程:-p PID 查看运行中的程序调用。

strace 是系统调试的神器,了解程序和内核交互的细节一目了然!

77.iostat:监控磁盘 I/O 和 CPU 性能

“硬盘和 CPU 忙不忙?用它一查便知!”**

用法:iostat [选项] [间隔时间] [次数]

  • 默认输出: 显示 CPU 和设备的 I/O 使用情况。

常用操作:

# 1. 查看 CPU 和磁盘 I/O 使用情况
iostat

# 2. 持续监控,每 2 秒刷新一次,共显示 5 次
iostat 2 5

# 3. 显示设备的详细 I/O 信息
iostat -d

# 4. 显示 CPU 的详细使用情况
iostat -c

# 5. 显示所有设备的完整统计信息
iostat -x

注意:

  • 安装方法:如果未安装,执行以下命令:
sudo apt update
sudo apt install sysstat

小总结:

  • iostat 查看系统的 CPU 和磁盘性能。
  • -c-d,专注 CPU 或磁盘的详细信息。

iostat,轻松定位性能瓶颈!

78.vmstat:系统性能快照工具

“想快速了解 CPU、内存和磁盘的使用情况?用它看看!”

用法:vmstat [刷新间隔] [次数]

  • 默认输出: 显示 CPU、内存、磁盘、系统进程等统计信息。

常用操作:

# 1. 查看一次系统性能快照
vmstat

# 2. 持续监控,每秒刷新一次,共显示 5 次
vmstat 1 5

# 3. 显示内存、I/O、CPU 和系统状态
vmstat -a

# 4. 显示磁盘块 I/O 信息
vmstat -d

# 5. 显示更详细的 CPU 使用统计
vmstat -t

小总结:

  • 查看系统状态:vmstat 直接获取快照。
  • 持续监控:vmstat 间隔 次数 实时跟踪系统性能。

vmstat 是诊断系统瓶颈的好帮手,尤其适合 CPU 和内存问题排查!

79.dmesg:查看内核日志

“想知道系统硬件或内核发生了什么?用它看看!”

用法:dmesg [选项]

  • 显示系统启动以来的内核日志信息,适合调试硬件问题。

dmesg 常用操作示例:

# 1. 查看完整内核日志
dmesg

# 2. 分页查看内核日志
dmesg | less

# 3. 查看特定关键词日志,比如 USB
dmesg | grep usb

# 4. 实时监控内核日志更新
dmesg -w

dmesg 配合过滤和分页使用,让内核日志清晰直观,实时监控硬件动态更方便!

80.journalctl:万能日志查看器

“任何服务的日志都能查。”

用法:journalctl [选项]

  • 查看系统启动以来的所有日志。

常用操作示例:

# 1. 查看所有日志
journalctl

# 2. 查看特定服务的日志
journalctl -u 服务名

# 比如查看 nginx 服务的日志
journalctl -u nginx

# 3. 实时查看日志更新
journalctl -f

# 4. 查看最近一小时的日志
journalctl --since "1 hour ago"

通过 journalctl,可以方便地查看、过滤和实时跟踪系统日志,调试问题更高效!

81.uptime:这台机跑多久了?

“系统开机多久了?负载高不高?用它一查便知!”

用法:uptime [选项]

  • 显示当前时间、系统运行时长、登录用户数和平均负载。

常用操作示例:

# 1. 查看系统运行时间、登录用户数和平均负载
uptime

# 2. 只显示系统运行时间(更简洁)
uptime -p

# 3. 查看系统启动的具体时间
uptime -s

uptime 是一个简单直观的工具,用来快速了解系统运行时长和负载情况。结合 -p-s 参数,更清晰易读!

82.htop:交互式资源监控工具

“想直观地看 CPU、内存使用情况?用它更方便!”

用法:htop

  • 启动后进入交互式界面,显示系统性能、进程详情,支持排序和操作。

常用操作:

# 先安装
sudo apt update
sudo apt install htop  

# 1. 启动 htop
htop

# 2. 按 F6:切换排序方式
# 比如按 CPU 使用率排序或按内存占用排序。

# 3. 按 F9:结束进程
# 选择进程后,按 F9 并确认结束。

# 4. 按 q + 回车:退出

htop 是增强版的任务管理器,比 top 更易用直观,适合日常监控系统资源和管理进程!

第十一部分:开发者工具,命令行上的黑科技

83.diff:文件不同在哪?

“快速比较两个文件。”

用法:diff [选项] 文件1 文件2

  • 比较两个文件的内容并显示差异。

常用操作:

# 1. 简单对比两个文件
diff file1.txt file2.txt

# 2. 忽略大小写对比
diff -i file1.txt file2.txt

# 3. 递归对比两个目录
diff -r dir1/ dir2/

# 4. 只显示不同的行
diff --brief file1.txt file2.txt

小结:

  • diff 对比文件或目录,快速找到不同之处。
  • 配合参数如 -i(忽略大小写)或 -r(对比目录)更灵活!

84.xargs:批量操作的好帮手

“想将命令的输出作为另一个命令的输入?用它批量处理!”

用法:xargs [选项] [命令]

  • xargs 将标准输入中的内容转换为命令行参数,适合批量处理。

常用操作:

# 1. 删除匹配的文件(结合 find 使用)
find . -name "*.log" | xargs rm -f

# 2. 将列表中的文件名批量传递给 echo
echo "file1 file2 file3" | xargs echo

# 3. 控制每行传递的参数数量(每次处理 1 个)
echo "file1 file2 file3" | xargs -n 1 echo

# 4. 配合 -I 替换参数(灵活处理每个输入)
echo "file1 file2 file3" | xargs -I {} mv {} /backup

# 5. 并行执行命令(加速批量处理)
find . -name "*.jpg" | xargs -P 4 cp -t /backup

解释:

  • | xargs:将前一个命令的输出传递给后续命令。
  • -n:每次传递的参数数量。
  • -I {}:用 {} 表示输入的每个参数。
  • -P:指定并行执行的任务数。

小总结:

  • 批量删除: 结合 findxargs rm
  • 参数替换:-I {} 灵活指定处理逻辑。
  • 并行加速:-P 提高效率。

xargs 是命令行批量操作的必备工具,简单高效!

85.tee:数据双向输出工具

“想让命令的输出同时保存到文件和终端?用它轻松搞定!”

用法:command | tee [选项] 文件

  • 将命令的标准输出(stdout)同时保存到文件和显示在终端。

常用操作:

# 1. 将命令的输出保存到文件,同时显示在终端
ls -l | tee output.txt

# 2. 追加到文件(不覆盖原文件内容)
ls -l | tee -a output.txt

# 3. 将命令输出保存到多个文件
ls -l | tee file1.txt file2.txt

# 4. 将错误输出(stderr)也保存到文件
ls nonexistentfile 2>&1 | tee errors.log

解释:

  • | tee 文件:将命令的标准输出保存到指定文件。
  • -a:追加模式,不覆盖已有文件内容。
  • 2>&1:重定向错误输出到标准输出,便于保存日志。

小总结:

  • 保存日志:tee 保存输出日志并实时查看。
  • 追加内容:-a 确保不覆盖原文件。
  • 错误捕获:2>&1 保存所有输出(标准和错误)。

tee 是日志记录和命令调试的好帮手,让输出信息无遗漏!

86.ln: 链接命令

  • -s 创建软链接
# 创建软链接
ln  -s  原始文件  链接文件
# 删除链接文件不影响原始文件,原始文件一旦移动或失效,软链接也会失效
# 硬链接 删除原始文件对硬链接的文件没有影响,硬链接只能链接文件
ln   原始文件  链接文件

87.Linux重定向

stdin stdout stderr

  • 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
  • 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

通常是用文件或命令的执行结果来代替键盘作为新的输入设备,而新的输出设备通常指的就是文件。

命令符号格式 作用
命令 < 文件 将指定文件作为命令的输入设备
命令 << 分界符 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串 cat << EOF
符号 作用
命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

88.echo: 用于在屏幕上输出

echo -e  "\033[31;47m  输出内容 \033[0m"
# 可以输出系统变量的值
echo $LANG  # 输出系统语言
echo $PATH  # 输出系统中所有可执行程序路径

89.date: 查看和修改日期时间

# 查看时间
date +"%F %T"
# 把时间作为文件名的一部分来创建 
touch a.$(date +"%Y-%m-%d")
# 备份log日志
tar -cjvPf var_log.$(date +"%F").tar.bz2 /var/log/
# 修改时间
date -s "2009-11-15"
# 网络时间同步
yum -y install ntp ntpdate
# 根据时间授时服务器来同步时间
ntpdate ntp1.aliyun.com

90.cal: 查看日历

cal
      七月 2025
日 一 二 三 四 五 六
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

91.history: 查看历史命令

vim ~/.bash_history 记录历史命令

> ~/.bash_history # 清空历史命令
set +o history  # 不记录历史命令
set -o history  # 重新记录历史命令

92.nmtui: 用于修改网卡配置

修改网卡信息 /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet          # 网络类型
BOOTPROTO=static       # 启动协议  none\dhcp\static
NAME=eth0              # 网卡名
DEVICE=ens33           # 设备名
ONBOOT=yes             # 是否开机启动 yes 
IPADDR=192.168.80.110  # IP地址设置
PREFIX=255.255.255.0   # 子网掩码
GATEWAY=192.168.80.2   # 网关
DNS1=8.8.8.8           # DNS

重启网卡

  • /etc/init.d/network restart
  • systemctl restart network

本地Yum源的配置 /etc/yum.repos.d/

# 加载光盘
mkdir /media/cdrom 
mount /dev/sr0  /media/cdrom  # 挂在光盘到系统的/media/cdrom 目录

# 修改本地Yum源
cd /etc/yum.repos.d/ 
## 备份原来的Yum源
mkdir bak
mv *.* bak
# 修改本地yum源
cp bak/CentOS-Media.repo ./
vim CentOS-Media.repo
###################################################
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/   # 光盘挂载路径 
gpgcheck=0                     # 是否验证软件包   0
enabled=1                      # 是否开启本yum源  1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
###################################################
yum makecache   # 获取yum源的缓存
yum -y install zsh 

第十二部分:软件管理

93.rpm: rpm包管理器

  • -i 安装软件包
  • -e 卸载软件包
  • -vh 显示安装或卸载过程
  • -q 查找软件包相关信息
  • -qa 系统中所有已经安装的软件包的信息
  • -qi 指定某个软件包的详细信息
  • -ql 显示安装包的安装目录.依赖文件.帮助文档
  • -qc 只显示安装目录
  • -qd 安装的文档目录
  • -qf 查看文件.命令属于哪个安装包
# 安装rpm软件包
rpm -ivh wget-1.14-18.el7.x86_64.rpm
# 卸载软件包
rpm -evh wget
# 更新
rpm -Uvh wget-1.14-18.el7.x86_64.rpm

94.yum: 一键安装软件

yum -y install 软件包名

  • -y:同意安装,不需要在安装过程中确认。
  • install: 安装软件
  • remove: 移除已经安装上的软件
  • update: 更新软件
  • makecache: 产生软件包的缓存
  • repolist all: 列表所有yum(源)仓库信息
  • list all: 列出所有软件包名 yum list all| grep "bash"
  • info: 查看软件包的信息
  • clean all: 清理仓库缓存
  • check-update: 检测软件更新
  • grouplist: 显示所有软件组
  • groupinstall: 安装某个软件组
  • groupremove: 删除软件组
  • groupinfo: 查询组信息

第十三部分:分区与格式化

95.fdisk: 磁盘分区命令

# 显示磁盘的信息
fdisk -l
# 对sdb磁盘进行分区
fdisk /dev/sdb
n  # 创建新分区
    p    # 主分区
    默认  # 分区编号
    默认  # 选择扇区
    +2GB # 选择分区大小
w  # 保存分区信息 

96.mkfs.xfs: xfs文件系统磁盘格式化

# 磁盘格式化命令(xfs文件系统)
mkfs.xfs  /dev/sdb1
# 挂载新分区到系统/mnt目录上
mount /dev/sdb1 /mnt/
# 查看当前系统上的磁盘信息
df -h 

fdisk /dev/sdb 
p  # 查看当前磁盘的分区状态
d  # 删除分区
w  # 保存

mkdir /data/{c,d,e}

vim /etc/fstab 

/dev/sdb1          /data/c               ext4    defaults        0 0 
/dev/sdb5          /data/d               ext4    defaults        0 0 
/dev/sdb6          /data/e               xfs     defaults        0 0  

96.mkfs.ext4: ext4件系统磁盘格式化

  • mkfs.ext4 /dev/sdb1

97.mkwsap: 把磁盘分区格式化成交换分区

mkwsap /dev/sdb5

98.swapon: 开启新的交换分区

swapon /dev/sdb5

99.swpaoff 关闭交换分区

swpaoff /dev/sdb5

第十四部分:进程管理命令

什么是守护进程?

  • daemon
  • 在后台运行
  • 不接受用户直接控制
  • 执行特定的任务
  • init network httpd crond

前台服务.后台服务

  • 在终端中正在执行的程序ping

如何切换前后台服务?

100.jobs: 查看所有在后台被暂停的任务

  • Ctrl + Z 将服务暂停在后台

101.fg n: 将后台暂停的服务,拉回前台继续执行

102.bg n :(backstage) 将后台暂定的服务在后台继续运行

在命令执行的最后面加 & 让程序在后台继续执行

第十五部分:系统的启动流程

  • 1.开机自检,BIOS, 在主板上的ROM芯片上存储
  • 2.加载MBR \ UEFI
  • 3.GRUB2 引导菜单
  • 4.加载内核
  • 5.启动init ( 初始化)0 ~ 6
    • 0 关机
    • 1 无网络的单用户模式(root)
    • 2 无网络的多用户模式
    • 3 有网络的多用户模式
    • 4 (无)保留模式
    • 5 GUI有网络多用户模式
    • 6 重启模式
  • 6.启动内核模块
  • 7.启动不同级别的脚本
  • 8.启动成功 (sshd)

第十六部分:Linux基础服务

1.SSH (安全的远程登录协议)

  • 使用非对称加密方式对数据加密
  • 对称加密(加密和解密使用同一个秘钥)中间人攻击
  • 非对称加密方式,公钥(只能加密)和私钥(只能解密)
访问端a  <---->  服务端b
       公钥a
       公钥b 
  • ssh 用户名@ip地址:22

免密码登录的原理:

  • 1.给服务端发送一个随机字符串
  • 2.服务端把这个随机字符串使用访问端的公钥加密后再发送给访问端
  • 3.访问端私钥解密后将两个字符串进行比对,成功后运行登录。

103.ssh-keygen :生成公钥私钥对

104.ssh-copy-id: 将公钥复制到对方服务器的authorized_keys

  • 服务端主程序:/usr/sbin/sshd 默认端口22
  • 客户端主程序:/usr/bin/ssh
  • 服务端配置文件:/etc/ssh/sshd_config
  • 客户端配置文件:/etc/ssh/ssh_config
# etc/ssh/sshd_config
PermitRootLogin yes  # 是否直接让root用户登录系统

105.setenforce 0 临时关闭selinux

[root@Base ~]# vim /etc/selinux/config 
​```
SELINUX=disabled
​```
[root@Base ~]# setenforce 0
[root@Base ~]# systemctl 
[root@Base ~]# systemctl stop firewalld
[root@Base ~]# systemctl disable firewalld

hostnamectl set-hostname server-112 # 修改主机名(永久生效)

21   ftp
22   ssh  sftp  
80   http 
443  https
137\138\139\445  samba
3306 mysql
9000 php
8080 tomcat

2.Samba 服务

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。

SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

# 安装服务
yum -y install samba samba-client

# 启动服务
systemctl start smb nmb 

#  新建一个用户,用于文件共享
useradd -s /sbin/nologin  test 
#  创建smb共享密码
smbpasswd -a  test
#  设置访问权限
chmod -R 755 /home/test/

# 修改配置文件
vim /etc/samba/smb.conf

#配置文件类似如下
[test]  # 共享名
comment = "samba test"   # 描述信息
path = /home/test     # 共享目录
browseable = yes      # 所有人可见
public = yes          # 是否公开
writable = yes        # 是否允许修改

# 重启服务
systemctl start smb nmb 
[global]
        workgroup = MYGROUP           #工作组名称
        server string = Samba Server Version %v         #服务器描述

#netbios名称

;       netbios name = MYSERVER      

#设置允许侦听的本地网络接口

;       interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24  

                   #指定允许连接samba服务器的网段和IP

;       hosts allow = 127. 192.168.12. 192.168.13.

                   #禁止对应网段的访问,这些也可以单独设置在共享中  

                   hosts deny = 192.168.80.20

# --------------------------- Logging Options ---------------



        #日志存放路径

        log file = /var/log/samba/log.%m

        #每个日志文件的最大容量

        max log size = 50



# ----------------------- Standalone ServerOptions-----------------

#安全级别分五种:

#share: 共享级别,服务器不对客户机进行身份验证,不推荐使用。

#user: 用户级别,服务器对客户机进行身份验证,默认使用这个。

#server: 服务器级别,Samba服务器必须通过另一台服务器对客户机进行身份验证。如果设置为此值,需另加一行:password Server = IP才行。

#domain: 域级别,Samba服务器要通过windows server的域控制器对客户机进行身份验证,需另加一行:password Server = IP才行。

        security = user 

#指定Samba服务器对用户帐户和密码的管理方式。一般默认即可,不推荐使用smbpasswd文件保存密码。
        passdb backend = tdbsam



#============================ Share Definitions===================

#这里定义的是家目录的共享,共享是的文件夹名称为用户名

[homes]
        comment = Home Directories  #注释信息

        browseable = no  #文件夹是否可以被其它用户浏览

        writable = yes   #用户是否可以写入

;       valid users = %S  #设置允许访问的用户

                   #允许访问的域用户,%S是一个samba变量,代表当前服务器名

                   #%u代表当前服务器的用户

;       valid users = MYDOMAIN\%S



#打印共享

[printers]

        comment = All Printers

        path = /var/spool/samba

        browseable = no

        guest ok = no

        writable = no

        printable = yes

#常用选项

comment = 备注信息

path = 绝对路径

public = yes/on 是否允许显示给所有人

valid users = 用户名/@用户组      设置允许访问的用户或用户组,默认为yes。

readonly = yes/on 是否为只读

writable = yes/on 是否允许读写

write list = 用户/@用户组 允许读写的用户名单

guest ok = yes/on 是否允许匿名访问

guest only = 只允许匿名访问

creat mask = 权限掩码

directory mask = 目录掩码

常见通配符

%S = 当前服务名(如果有的话)

%P = 当前服务的根目录(如果有的话)

%u = 当前服务的用户名(如果有的话)

%g = 当前用户说在的主工作组

%U = 当前对话的用户名

%G = 当前对话的用户的主工作组

%H = 当前服务的用户的Home目录

%v = Samba服务的版本号。

%h = 运行Samba服务机器的主机名

%m = 客户机的NETBIOS名称

%L = 服务器的NETBIOS名称

%M = 客户机的主机名

%N = NIS服务器名

%p = NIS服务的Home目录

%R = 说采用的协议等级(值可以是CORE, COREPLUS, LANMAN1, LANMAN2,NT1)

%d = 当前服务进程的ID

%a = 客户机的结构(只能识别几项:Samba,WfWg,WinNT,Win95)

%I = 客户机的IP

%T = 当前日期和时间

4.DNS服务

域名解析服务

  • 正向解析:输入域名返回返回IP地址
  • 反向解析:输入IP地址返回域名

需要安装软件包: bind

服务名称: named

yum -y install bind*

systemctl restart named
systemctl enable named 

systemctl stop firewalld
systemctl disable firewalld

setenforce 0

sed  -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

# 查看named的主配置文件
vim /etc/named.conf 
###############################################
listen-on port 53 { any; };  # 绑定的地址需要修改
allow-query     { any; };  # 允许查询的服务地址
##############################################

www.rtkj.com 192.168.80.22 mail.rtkj.com 192.168.80.33 dns.rtkj.com 192.168.80.133 ftp.rtkj.com 192.168.80.122 new.rtkj.com 192.168.80.101

# 确定“域”名 --> rtkj.com
#  /etc/named.conf 或 /etc/named.rfc1912.zones
vim /etc/named.rfc1912.zones  # 辅助域配置文件
#######################################################
# 定义正向解析域
zone "rtkj.com" IN {
        type master;            
        file "rtkj.com.zone";   # 正向解析是设定好域名,通过域名从正向解析文件中找响应的IP地址。
        allow-update { none; };
};

# 定义反向解析域
zone "80.168.192.in-addr.arpa" IN {
        type master;
        file "80.168.192.zone";  # 设定好ip的网络段,通过ip找域名
        allow-update { none; };
};
#######################################################

# 到/var/named 下创建并修改zone文件
cd /var/named/

touch rtkj.com.zone  80.168.192.zone
vim rtkj.com.zone
:r ./named.localhost 
############################################################################
$TTL 1D
@       IN SOA  rtkj.com. root.rtkj.com. (
                                        133     ; serial  版本号
                                        1D      ; refresh 更新时间
                                        1H      ; retry   重试时间
                                        1W      ; expire  终止时间
                                        3H )    ; minimum 默认DNS缓存时间

        IN NS   dns.rtkj.com.
        IN MX   10 mail.rtkj.com.
www     IN  A   192.168.80.22
mail    IN  A   192.168.80.33
dns     IN  A   192.168.80.133
ftp     IN  A   192.168.80.122
new     IN  A   192.168.80.101
##############################################################################

vim 80.168.192.zone
:r ./named.loopback
#######################################################################################
$TTL 1D
@       IN SOA  rtkj.com. root.rtkj.com. (
                                        133     ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.rtkj.com.
22      PTR     www.rtkj.com.
33      PTR     mail.rtkj.com.
133     PTR     dns.rtkj.com.
122     PTR     ftp.rtkj.com.
101     PTR     new.rtkj.com.
#################################################################################
  • A记录 A(Address)记录是用来指定域名对应的IP地址记录。
  • NS记录 NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
  • MX记录 MX(Mail Exchanger)记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。
  • CNAME记录 CNAME(Canonical Name )别名记录,允许您将多个名字映射到同一台计算机。通常用于同时提供WWW和MAIL服务的计算机。
  • PTR值 PTR是pointer的简写,用于将一个IP地址映射到对应的域名,也可以看成是A记录的反向,IP地址的反向解析。

sed 行处理文本工具

ss 网络服务与端口查看命令

  • lntup 查看所有tcp\udp连接服务运行情况

5.LAMP 环境搭建

Linux 操作系统

Apache Web服务器

Mysql or Mariadb or (MongoDB)

PHP or Python or Perl

LAMP是目前使用最为广泛的一种动态网站的搭建方式。

yum搭建lamp

# 0.准备好系统,关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld

setenforce 0
######
# 配置本地yum源省略
######
# 1.安装常用软件和lamp环境
yum -y install vim  lrzsz wget tree net-tools 
yum -y install httpd mod_ssl  php*  mariadb-server 

# 2.测试php环境
cd /var/www/html/
touch index.php 
vim index.php
#####################
<?php
phpinfo(); 
?>
#######################
systemctl restart httpd
# 3.初始化mariadb
systemctl restart mariadb 
# 执行初始化命令
mysql_secure_installation
# 设置mysql的root的密码
# 删除临时用户.测试库.不允许远程登录都是Y
mysql -uroot -p 
/s;查看数据库状态
/q;退出数据库
# 4.将php源代复制
unzip ZenTaoPMS.11.6.5.zip 
bash zentaopms/bin/init.sh 
cp -r zentaopms/* /var/www/html/
###################################
# 5.访问
http://192.168.80.134/www/
# 6.增加依赖
yum -y install php-mbstring
# 0.更换yum原

yum -y install epel-release

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 1.安装php

yum install php7*

第十七部分:Shell脚本基础

  • shell 是Unix/Linux命令解释器程序。
  • 脚本是可以被解释器执行的源代码。
  • 大多数linux默认的shell使用bash解释器。

1.创建Shell脚本

  • 创建一个空的文本文件。建议.sh结尾;
  • 文本当中第一行 #!/bin/bash ,确定脚本的解释器;
  • 除第一行外#表示注释;

2.运行Shell脚本

  • bash 脚本
  • chmod +x 脚本
  • ./脚本
  • 脚本的绝对路径

3.变量

  • 什么是变量?

  • 内存中的一个存储空间的别名。

  • 可以用于存放临时数据。
  • 可以变量赋值数据,可以在需要的时候从变量中直接取数据。

  • 创建变量?

  • 起变量名

    • 不能和命令(关键字)冲突
    • 数字.字母.下划线组成
    • 不能以数字开头
  • 变量的赋值

    • $变量 一般用于取值或变量叠加
    • 在赋值等于号的左右都不能有空格
    • 将命令的执行结果赋值给变量可以用反引号或者$(命令)
    #!/bin/bash 
    # Author: ZuoJie
    # Time: 2019-12-6
    # Desc: 用于Shell脚本的基础学习
    # Version: 1.0

    #code="hello world"
    #code=$code"  1234"

    datetime=$(date +%T)
    memory=$(free -m | awk '{if(NR==2) print $3/$2*100"%"}')

    echo -e "\033[32m$datetime\033[0m" 
    echo "内存使用率:"$memory 

4.环境变量

  • 存储系统环境中数据的变量,可以修改它的值。
  • PATH : 可执行程序(命令)的的目录路径
  • LANG: 当前shell环境中的默认语言
  • PS1:shell终端的提示符
  • PWD:当前路径

5.查看与修改系统环境变量

  • set 查看当前shell中的所有变量
  • env 环境变量
  • 系统环境变量使用大写字母命名
  • 修改系统环境变量
  • export PATH=/root/script/:$PATH # 在当前shell和当前shell的子shell中有效。
  • /etc/profile # 环境变量修改对所有用户生效
  • /etc/bashrc # 对所有使用bash的用户生效
  • ~/.bash_profile
  • ~/.bashrc
  • source .bash_profile 或 . .bash_prifile # 重载配置文件
  • unset 用户删除变量

6.特殊变量

  • 位置参数变量 : 向脚本中传递参数
  • $0~$9 ${10} 用于在执行脚本值,接收外部传递进来的参数
  • $ | $@ 用于接收所有的参数(参数数组),"$" 将所有参数作为一个整体 "$@"将所有参数分散获取
  • $# 用于存放参数的个数
  • 预定义变量
  • $? 上一个命令执行的结果是否正确,正确执行返回值为0,执行错误返回非0
  • $$ PID 当前脚本
  • $! 最后一个在后台运行的程序的PID
  • 单引号 引起来的变量:显示内容本身
  • 双引号 引起来的变量:显示变量的值

7.键盘接收数据

read 参数 变量名

  • 参数
  • -p 提示信息
  • -s 隐藏字符
  • -t 输入超时时间
  • -n 允许输入的字符个数

8.修改变量的类型

declare

  • -i 将变量变为整数类型
  • -x 将变量设置为系统环境变量
  • -p 显示变量类型

9.条件判断

1.判断的格式

# 判断的简化写法  
# [ 判断参数 文件/目录/数值/字符串/命令执行的结果 ]  && 判断为真时,执行   || 判断结果为假时执行。
[ -d /abcd ] && echo "目录存在" || mkdir /abcd 
# 判断的完整写法
if [ 判断条件表达式 ];then
   判断为真时,执行的命令
else
   判断为假时,执行的命令
fi
#!/bin/bash 

read -p "请输入一个路径:" mypath

if [ -d $mypath  ];then 
    echo "$mypath目录存在"
else 
    echo "$mypath目录,正在创建...."
    mkdir -p $mypath
    [ -d $mypath ] && echo "$mypath目录创建成功" || echo "$mypath目录创建失败"  
fi

比较参数

test check file types and compare values (检测文件类型和比较值) 与 [ ] 完全等价

参数 功能
EXPRESSION is false 取反,将真的结果变成假的,假的变真的
-a both EXPRESSION1 and EXPRESSION2 are true(两个表达式同时为真时,结果为真)
-o either EXPRESSION1 or EXPRESSION2 is true (任意一个表达式为真,结果为真)
-n the length of STRING is nonzero (字符串长度不为空时,结果为真)
-z the length of STRING is zero (字符串为空的时候,结果为真)
== the strings are equal (两个字符串比较相等时,值为真)
!= the strings are not equal (两个字符串比较不相等时,值为真)
-eq INTEGER1 is equal to INTEGER2 (两个整数相等时,结果为真)
-ne INTEGER1 is not equal to INTEGER2 (两个整数不相等时,结果为真)
-ge >= INTEGER1 is greater than or equal to INTEGER2
-gt > INTEGER1 is greater than INTEGER2
-le <= INTEGER1 is less than or equal to INTEGER2
-lt <INTEGER1 is less than INTEGER2
-ef FILE1 and FILE2 have the same device and inode numbers (两个是否是同一个文件,互为硬链接)
-nt FILE1 is newer (modification date) than FILE2 (文件1比文件2新)
-ot FILE1 is older than FILE2 ( 文件1比文件2旧时为真)
-b FILE exists and is block special (文件存在,并且是块文件)
-c FILE exists and is character special (文件存在,并且是字符文件)
-d FILE exists and is a directory (文件存在,并且是目录)
-e FILE exists (文件只要存在,结果为真)
-f FILE exists and is a regular file ( 普通文件)
-g FILE exists and is set-group-ID ( rwxrws--- )
-G FILE exists and is owned by the effective group ID
-h FILE exists and is a symbolic link (same as -L)
-k FILE exists and has its sticky bit set (drwxrwxrwt)
-L FILE exists and is a symbolic link (same as -h) 软链接文件
-O FILE exists and is owned by the effective user ID
-p FILE exists and is a named pipe 管道文件
-r FILE exists and read permission is granted 读权限(普通用户)
-s FILE exists and has a size greater than zero 空文件为真
-S FILE exists and is a socket 是否是网络套接字
-t file descriptor FD is opened on a terminal 在终端上打开文件描述符FD
-u FILE exists and its set-user-ID bit is set
-w FILE exists and write permission is granted 判断写权限
-x FILE exists and execute (or search) permission is granted 判断执行权限
# 修改数据库root密码
old_password="admin"
new_password="123456"
mysql -uroot -p$old_password <<EOF
UPDATE mysql.user SET Password=PASSWORD("$new_password") WHERE User="root";
FLUSH PRIVILEGES;
EOF

case 分支结构

case $变量 in 
    值1)
      变量等于值1时执行代码
      ;;
    值2)
      变量等于值2时执行代码
      ;;
    # 省略......
    *)
      执行代码
      ;;
esac

10.循环

# for的第一种写法(循环数组内容或命令结果)
for 变量 in 一组数据;do   #  1 2 3 4 5 6  
    echo $变量   # 通过$变量可以按顺序重一组数据中依次取数据
done 

# for的第二中写法(有明确的循环次数)
for ((i=0;i<10;i++));do
    echo $i
done

# while 循环 (没有明确的循环次数时,使用while)
while [ 条件表达式 ];do
    需要重复执行的代码 
done 

# until 循环 条件为假时,循环
until [ 条件表达式 ];do
    需要重复执行的代码 
done 

# exit     退出脚本
# break    退出循环
# continue 退出当前循环,继续下次循环

11.转义字符

转义字符 含义
\n 换行
\t 水平制表符(tab)
\r 回车
\\ 反斜杠\
\" "
\' '

12.交互简单方法

# 使用输入重定向在脚本内部创新的分区
fdisk /dev/sdb <<EOF
n
p


+10G
w
q
EOF

13.数组

  • 一组数据
  • 数组中的每个数据(元素)会有编号,索引或者下标(index)
  • 普通数组 :一组有顺序的数据。从零开始的数字作为下标。
  • 关联数组:使用字符串作为下标。
# 创建数组 
# 给数组一个个元素的赋值
arr1[0]="A"
arr1[1]="B"
arr1[2]="C"

# 一次给数组赋多个值
arr2=( "apple"  "banana"  "orange" )

arr3=(`ls /`)

echo ${arr1[*]}  # 获取数组中所有的数据
echo ${arr1[0]}  # 通过下标获取某一个值
echo ${!arr1[@]} # 只获取数组的索引下标
echo ${#arr1[@]} # 获取数组中元素的个数
echo ${arr1[@]:开始下标:数量} # 部分获取(切片) 
#!/bin/bash 

# 将输入信息存入到数组中

for((i=0;i<3;i++));do
    read -p "请输入学生姓名:" n
    name[$i]=$n
    read -p "请输入学生年龄:" a
    age[$i]=$a
    read -p "请输入学生性别:" s
    sex[$i]=$s
done

while true;do
     read -p "请输入您要查询的学生姓名:" n2
     [ $n2 == "Q" ] && break
     for((i=0;i<3;i++));do
         if [ $n2 == ${name[$i]} ];then
             echo ${name[$i]}":"${age[$i]}":"${sex[$i]} 
         fi
     done   
done

14.关联数组

declare -A  数组名

数组名[索引名]=
数组名=([索引名1]=值1  [索引名2]=值2 ...)

15.函数

预先定义好的一个代码段。需要起个名字,叫做函数名。(不能和已有命令冲突)
通过函数名来执行代码。
# 定义函数方法一
function 函数名(){
     需要被执行的代码或命令。
} 

# 定义函数方法二
函数名(){
     需要被执行的代码或命令。
}

# 调用执行函数
函数名 参数1 参数2  


# 案例比大小 
function Gt(){
   # shell 中的位置参数,根据函数外部传入的顺序来获取值
   if [ $1 -gt $2  ];then
       echo $1"大"
       # 返回状态码,省略return 默认返回0
       return 0
   else
       echo $2"大"
       return 1
   fi
}

Gt  12  3
符号 功能
. 1. 当前目录 2.正则中表示任意字符 3. ./用于执行当前目录下的脚本或程序 4.隐藏文件以.开头
; 1.在同一行执行多个命令时使用 ls ; date ; cal
.. 1.上层目录
- 1.短参数 2. 之前的工作目录
-- 1.长参数
~ 1.用户家目录
$ 1.获取参数的值 2.也表示普通用户
$? 1.判断上一个命令执行的结果
$1~$9 1.特殊参数(位置参数 $1~$9 ${10} )
$# 1.参数的个数
$* 1.获取所有参数
$@ 1.获取所有参数
$! 1.在后台执行的命令的pid
$$ 1.当前shell的pid
! 1.取非
@ 1.用户名@主机地址
# 1.shell中的注释 2.root 用户
% 1.字符串格式化 %s 字符串 %d 整数 %f 小数(浮点数) 2. 求余数
^ 1.正则中用于匹配开头 2.[^] 取反
& 1. 指令1 && 指令2 && 指令3 当之前所有的指令都成功执行时(返回结果为0)
* 1. shell中表示统配符 用于匹配任意长度的任意字符 2. 正则表达式中表示匹配 3. 乘法
() 1.计算时的优先级最高,优先计算小括号中的指令 2. ( 指令 )会默认在当前shell的子shell中执行。
$() 1.获取命令执行的结果
+ 1.加法 2.某些参数 3.正则中用于匹配数量1到无数次
[] 1. 条件判断 2.[a-z] 范围匹配
$[] $(()) 1.数值计算不能计算小数
\ 1.转义字符 \n \r \t \v
/ 1.根 2.路径的分割符
? 1.统配符中表示1个任意字符 2.正则表达式中表示 数量0/1 数量后表示非贪婪模式
{} 1.正则中 {n,m} 数量n~m个 2.函数的的范围 3.${array[0]} 数组取值 4.${变量} 获取遍历
: 1.vim进入末行模式
| 1.管道符 将前一个命令的执行结果交给后一个命令接着执行
|| 1. 或操作 2.前一个命令执行错误时,才执行
’ ‘ 单引号 1.赋值变量时,数据中间有空格时使用
" " 双引号 1.与单引号不同的是“$变量”会获取变量的值
< 1.输入重定向 命令 < 文件
<< 1. 键盘输入的 数据交给命令执行 命令 << EOF
> 1.命令 > 文件 输出重定向
>> 1.命令 >> 文件 覆盖输出重定向
1 > 1. 将正确的内容输出
2 > 1.将错误内容输出
&> 1.全输出
` 反引号 | 1.获取命令的执行结果
= 1.用于赋值 2.用于比较

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。

16.函数定义

Shell 函数的定义格式如下:

function function_name () { list of commands [ return value ] } 其中function关键字是可选的。

#!/bin/bash
hello(){
    echo 'hello';
}
hello
运行结果:

hello

调用函数只需要给出函数名,不需要加括号。

函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:numeric argument required。

#!/bin/bash
function hello(){
    return 'hello';
}
hello
运行结果:

line 4: return: hello: numeric argument required

如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

#!/bin/bash
function hello(){
    return 'hello';
}
str=hello
echo $str
运行结果:

hello

像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示:

$unset .f function_name

如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。

函数参数 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…这就是前面讲的特殊变量。

#!/bin/bash
function sum(){
    case $# in 
        0) echo "no param";;
        1) echo $1;;
        2) echo `expr $1 + $2`;;
        3) echo `expr $1 + $2 + $3`;;
        *) echo "$# params! It's too much!";;
    esac
}
sum 1 3 5 6
运行结果:

4 params! It's too much!

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊变量用来处理参数,前面已经提到:

特殊变量 说明 $# 传递给函数的参数个数。 $ 显示所有传递给函数的参数。 $@ 与$相同,但是略有区别,请查看Shell特殊变量。 $? 函数的返回值。