Linux 系统遵循“一切皆文件”的原则,与 Windows 系统不同,它没有磁盘分区的概念,也没有文件后缀的区分。
/
(Root)/root
:超级用户(root)的家目录。/home
:普通用户的家目录,存放用户的个人文件。/bin
:存放系统启动和修复所需的二进制命令。/sbin
:存放系统管理员使用的高级命令工具。/boot
:包含引导加载程序和内核文件。不要随意修改。/dev
:设备文件所在,代表系统中的各种硬件设备。不要随意修改。/etc
:存放系统配置文件和环境变量定义。/proc
:虚拟文件系统,提供进程和系统信息。不要随意修改。/sys
:类似 /proc
,但更专注于设备和内核参数。不要随意修改。/lib
:存放 32 位的共享库文件,供应用程序调用。/lib64
:存放 64 位的共享库文件。/media
:用于自动挂载的设备,如 USB 驱动器。/mnt
:用于临时挂载的设备。/opt
:安装第三方软件包的目录。/run
:存放运行时数据,如 PID 文件、套接字文件等。/srv
:存放服务数据,如 Web 服务器的内容。/tmp
:存放临时文件,通常在系统重启时会被清除。/var
:存放日志文件、缓存、邮件队列等。虚拟机网络配置的不同模式有其特点,以下是三种常见的虚拟网络模式简要介绍:
特点
优点
缺点
特点
优点
缺点
特点
优点
缺点
192.168.x.0
为虚拟机指定的地址)。255.255.255.0
192.168.6.2
(2是固定网关地址)保存快照:虚拟机配置好后,建议保存快照,以便后续恢复。
Linux 系统中的运行级别表示系统的不同工作状态,每个运行级别代表一个系统的配置模式,以下是常见的几种运行级别:
3和5常用
sudo shutdown -h now
或 sudo poweroff
sudo systemctl isolate rescue.target
或 sudo telinit 1
sudo telinit 2
sudo telinit 3
sudo telinit 4
sudo telinit 5
sudo shutdown -r now
或 sudo reboot
在使用 systemd 的系统中,运行级别被映射为目标单元(target units)。例如:
poweroff.target
:对应运行级别 0(关机)。rescue.target
:对应运行级别 1(单用户模式)。multi-user.target
:对应运行级别 3(多用户模式)。graphical.target
:对应运行级别 5(图形化界面)。reboot.target
:对应运行级别 6(重启)。shift + z
:保存并退出(在 Vim 中使用)。ctrl + c
:终止当前命令或进程。tab
:自动补全命令或文件路径,帮助加快输入速度。*
:通配符,表示匹配所有文件或目录(如 *.txt
匹配所有 .txt
文件)。$
:表示变量的值。例如,$HOME
表示当前用户的家目录。-
:表示上一次使用的目录。比如,cd -
会让你返回到上一个目录。d
:表示目录,在 ls -l
列表中可以看到它显示为 d
开头的项。l
:表示符号链接(软连接),在 ls -l
列表中显示为指向其他文件或目录的链接。|
:管道符,将前一个命令的输出作为后一个命令的输入,常用于组合命令,如 ps aux | grep nginx
。↑
和 ↓
键浏览历史命令。clear
:清屏命令,清除终端中的内容。~
:当前用户的家目录。例如,cd ~
会进入当前用户的家目录。/
:根目录,系统的顶级目录。.
:当前目录。..
:上级目录。手册页(man page)是关于命令、系统调用、配置文件等的文档,通常遵循以下结构:
man [命令]
NAME:命令名称及简短描述
该部分列出了命令的名称,并简要说明它的功能。例如:
NAME
ls - list directory contents
SYNOPSIS:命令的基本语法
该部分显示命令的基本使用格式,包括命令名、可选参数和选项。例如:
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION:对命令的详细描述
详细解释命令的功能,如何使用它,以及它的行为。可能会包括一些注意事项。例如:
DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
OPTIONS:可用选项及其功能
列出命令支持的所有选项,并简要说明它们的作用。例如:
OPTIONS
-a, --all
Do not ignore entries starting with '.'
-l, --long
Use a long listing format
EXAMPLES:示例用法
给出命令的实际示例,帮助用户理解命令如何使用。例如:
EXAMPLES
ls -l
List directory contents in long format.
ls -a
List all files, including hidden files.
SEE ALSO:相关命令或文档
提供与当前命令相关的其他命令或文档的参考,帮助用户找到更多的资源。例如:
SEE ALSO
ls(1), stat(1), dir(1)
除了 man
命令外,还有一些其他方式来查看命令的帮助信息。
man
(手册页)
man <命令或配置文件>
:查看命令或配置文件的详细手册页。
例如:查看 ls
命令的手册页:
man ls
man -k
:搜索包含指定关键字的手册页。
例如:搜索与 copy
相关的命令:
man -k copy
<命令> --help
(命令行帮助)
许多 Linux 命令都支持 --help
选项,提供简短的帮助信息,显示命令的用法和可用选项。
例如:查看 ls
命令的帮助:
ls --help
这将显示 ls
命令的简短说明、常用选项、用法等。
<命令> -h
(帮助选项)
有些命令使用 -h
作为帮助选项(与 --help
类似)。
例如:查看 ls
命令的帮助:
ls -h
info <命令>
(Info 文档)
info
命令提供的帮助信息通常比 man
更详细,特别是对于一些复杂的命令。
例如:查看 ls
命令的 info
文档:
info ls
whatis <命令>
(简短的命令描述)
whatis
命令提供一个简短的命令描述,适用于你只需要快速了解命令功能时。
例如:查看 ls
命令的简短描述:
whatis ls
apropos <关键字>
(命令或帮助文档搜索)
apropos
命令用于查找与指定关键字相关的命令或帮助文档。
例如:搜索与 copy
相关的命令:
apropos copy
man
:最常用的帮助命令,提供详细的手册页。--help
和 -h
:命令行工具的简短帮助信息,快速了解命令的使用方法。info
:提供比 man
更详细的帮助文档,适合深入了解某些命令。whatis
和 apropos
:用于快速查找命令的简短描述或相关命令。其实没什么用了,现在有ai
操作之前,建议使用 sync
命令将内存中的数据同步到磁盘,以确保数据的完整性。
shutdown
(关闭系统)shutdown -h
:关机,-h
表示 halt,系统会关闭所有进程并停机。
例如:立即关机:
sudo shutdown -h now
shutdown -r
:重启系统,-r
表示 reboot,系统会重启。
例如:立即重启:
sudo shutdown -r now
shutdown +minutes
:设置延迟时间关机或重启,+minutes
表示在指定分钟后执行关机或重启。
例如:5 分钟后关机:
sudo shutdown -h +5
shutdown
命令可以让你在关机或重启前给其他用户发出警告消息。例如:
sudo shutdown -h +5 "系统将在5分钟后关机,请保存您的工作!"
reboot
(重启系统)reboot
:直接重启系统,相当于 shutdown -r
,执行该命令后系统会重新启动。
例如:
sudo reboot
poweroff
(关闭电源)poweroff
:关闭系统并切断电源,效果与 shutdown -h now
类似。该命令会关闭所有系统服务并最终关闭电源。
例如:
sudo poweroff
/
开始的路径。例如 /home/user/docs
。docs
或 ./docs
。pwd
(显示当前工作目录的绝对路径)作用:打印当前所在的工作目录。
例如:
pwd
ls
(列出目录内容)ls -a
:列出所有文件,包括隐藏文件(文件名以 .
开头)。
ls -l
:以长格式列出文件信息,显示文件的权限、大小、创建日期等。
例如:
ls -a
ls -l
ls -l
输出格式:每一行的输出信息依次表示:
-rwxr-xr-x
(表示文件类型、权限、用户权限、组权限等)cd
(切换目录)cd 绝对路径
:切换到指定的绝对路径。cd 相对路径
:切换到指定的相对路径。cd ~
或 cd
:回到当前用户的家目录,~
代表家目录。cd -
:切换到上一个工作目录。cd ..
:切换到当前目录的上一级目录。cd -P
:跳转到实际物理路径(如果有符号链接的话)。cd /
:回到系统根目录。mkdir
(创建文件夹)mkdir 文件夹名
:在当前目录下创建一个新的文件夹。mkdir 文件夹1/文件夹2
:在当前目录下的 文件夹1
中创建 文件夹2
。mkdir -p 文件夹1/文件夹2
:递归创建多级目录,若父目录不存在会一并创建。rmdir
(删除空目录)rmdir 文件夹名
:删除指定的空目录。如果目录不为空,命令将失败。touch
(创建文件)touch 文件名
:创建一个空文件或修改文件的时间戳。
例如:
touch a.txt
cp
(复制文件或目录)cp source dest
:将 source
文件复制到 dest
位置。cp -r source_dir dest_dir
:递归复制整个目录。\cp
:不询问,强制覆盖同名文件。rm
(删除文件或目录)rm 文件名
:删除文件。rm -r 目录名
:递归删除目录及其内容。rm -f 文件名
:强制删除文件,不会提示确认。rm -v 文件名
:显示删除过程中的详细信息。mv
(移动文件或重命名)mv oldFileName newFileName
:重命名文件或目录。mv sourceFile destinationDir
:将文件或目录移动到指定目录。备注:如果不再需要文件,最好先改名,如 mv filename filename.bak
,避免误删除。
cat
(查看文件内容)cat 文件名
:显示文件内容。
cat -n 文件名
:显示文件内容并带有行号。
例如:
cat a.txt
more
(分页查看文件内容)more 文件名
:以分页方式显示文件内容,按 Space
键查看下一页,按 Enter
键查看下一行,按 Q
键退出。Space
键:显示文件的下一屏内容。Enter
键:向下翻一行。B
键:显示上一屏内容。H
键:显示帮助屏。=
键:显示当前行号。less
(向前或向后浏览文件)less 文件名
:与 more
类似,但支持向前或向后浏览。
查找:
/字串
:向下查找。?字串
:向上查找。例如:
less a.txt
head
(查看文件的前几行)head 文件名
:查看文件的前 10 行。head -n 5 文件名
:查看文件的前 5 行。tail
(查看文件的后几行)tail 文件名
:查看文件的后 10 行。tail -n 5 文件名
:查看文件的后 5 行。tail -f 文件名
:实时追踪文件的更新(适用于日志文件等)。echo
(打印信息到控制台)echo hello world
:打印 hello world
到控制台。echo "hello world"
:支持多个空格。echo -e "hello\nworld"
:支持反斜杠控制字符(如换行)。覆盖 >
:将输出重定向到文件,覆盖原文件内容。
例如:
echo "hello" > file.txt
追加 >>
:将输出追加到文件末尾。
例如:
echo "world" >> file.txt
重定向输出:
cat file1 > file2
:将 file1
的内容覆盖到 file2
。echo "content" >> file
:将内容追加到文件。硬链接(ln
):为文件创建一个新的文件名,多个文件名指向同一个文件内容。
ln 文件1 文件2
:创建硬链接,文件2
成为指向 文件1
的新文件名。
例如:
ln a.txt b.txt
符号链接(软链接,ln -s
):类似于 Windows 的快捷方式,指向原文件或目录的路径。
ln -s /path/to/original /path/to/link
:创建符号链接。
例如:
ln -s /home/user/a.txt /home/user/b_link.txt
date
:显示当前时间和日期
date
输出示例:
Sat Jan 12 15:45:28 CST 2025
date +%Y
:只显示当前年份
date +%Y
输出示例:
2025
date +%m
:只显示当前月份
date +%m
输出示例:
01
date +%d
:只显示当前日期
date +%d
输出示例:
12
date "+%Y-%m-%d %H:%M:%S"
:显示完整的年月日时分秒
date "+%Y-%m-%d %H:%M:%S"
输出示例:
2025-01-12 15:45:28
date -d "1 day ago"
:显示一天前的日期
date -d "1 day ago"
输出示例:
Fri Jan 11 15:45:28 CST 2025
date -d "-1 day"
:显示一天前的日期(与上面相同)
date -d "-1 day"
输出示例:
Fri Jan 11 15:45:28 CST 2025
date "+%A"
:显示星期几的名称
date "+%A"
输出示例:
Saturday
date "+%B"
:显示当前月份的名称
date "+%B"
输出示例:
January
date -d "next Monday"
:显示下一个星期一的日期
date -d "next Monday"
输出示例:
Mon Jan 14 15:45:28 CST 2025
date -s "2025-01-13 10:30:00"
:设置系统时间为指定的日期和时间
sudo date -s "2025-01-13 10:30:00"
注意:该命令需要超级用户权限(使用 sudo
)。
date +%s
:显示当前时间的 UNIX 时间戳(自1970年1月1日以来的秒数)
date +%s
输出示例:
1673522728
useradd
:用于添加一个新用户。
useradd 用户名
useradd -g 组名 用户名
:将新用户添加到指定的组。useradd -g 组名 用户名
passwd
:用于设置用户的密码。
passwd 用户名
id
:查看指定用户的 UID、GID 以及所属于的组。
id 用户名
查看 /etc/passwd
文件:
cat /etc/passwd
或 vim /etc/passwd
:可以查看所有用户的详细信息,UID 从1000开始,/home下的为创建的普通用户。cat /etc/passwd
su
:切换用户(仅获得该用户的执行权限,不能获得环境变量)。
su 用户名
su -
:切换用户并获得该用户的环境变量和执行权限。
su - 用户名
userdel
:删除用户,但保留用户的主目录。
userdel 用户名
userdel -r
:删除用户及其主目录。
userdel -r 用户名
whoami
:显示当前用户的名称。
whoami
who am i
:显示当前登录用户的用户名。
who am i
sudo
:使用 sudo
命令以管理员权限运行其他命令。
sudo 命令
分发 sudo
权限:
/etc/sudoers
文件以分配 sudo
权限。
使用 vim /etc/sudoers
打开文件。
在 root
用户行下面添加指定用户的权限。例如:
root ALL=(ALL) ALL
用户名 ALL=(ALL) ALL
若要免密码使用 sudo
权限,可以写成:
用户名 ALL=(ALL) NOPASSWD: ALL
groupadd
:用于添加一个新组。
groupadd 组名
groupdel
:用于删除一个组。
groupdel 组名
查看 /etc/group
文件:
cat /etc/group
或 vim /etc/group
:可以查看所有组的信息。cat /etc/group
usermod
:用于修改用户的主组。
usermod -g 用户组 用户名
用户组
:指定的新主组名或组 ID(GID)。用户名
:需要修改的目标用户的用户名。说明:这些命令用于临时启动、停止、重启服务,服务名后可加 .service
(如 nginx.service
)。
启动服务:
service 服务名 start
例如:service httpd start
停止服务:
service 服务名 stop
例如:service httpd stop
重启服务:
service 服务名 restart
例如:service httpd restart
查看服务状态:
service 服务名 status
例如:service httpd status
启动服务:
systemctl start 服务名
例如:systemctl start nginx
停止服务:
systemctl stop 服务名
例如:systemctl stop nginx
重启服务:
systemctl restart 服务名
例如:systemctl restart nginx
查看服务状态:
systemctl status 服务名
例如:systemctl status nginx
查看当前运行的服务:
systemctl --type service
说明:这些命令用于管理服务的开机自启设置。
开启服务自启:
chkconfig 服务名 on
例如:chkconfig httpd on
关闭服务自启:
chkconfig 服务名 off
例如:chkconfig httpd off
查看指定服务的自启状态:
chkconfig 服务名 --list
例如:chkconfig httpd --list
查看所有服务的自启配置:
chkconfig
开启服务自启:
systemctl enable 服务名
例如:systemctl enable nginx
关闭服务自启:
systemctl disable 服务名
例如:systemctl disable nginx
查看服务是否设置为自启:
systemctl is-enabled 服务名
例如:systemctl is-enabled nginx
列出所有服务的启动状态:
systemctl list-unit-files
.service
后缀,但如果省略 .service
,系统会自动补全。start
、stop
)的效果只在当前运行期间有效,系统重启后不会保留。enable
、disable
)的效果会在系统重启后继续生效。Linux 系统中的文件权限分为 文件类型、属主权限、属组权限和其他用户权限,用 ls -l
命令可以查看文件的权限信息,例如:
-rwxr-xr--
详细解读:
文件类型:
-
:普通文件。d
:目录。l
:符号链接文件(类似于 Windows 的快捷方式)。c
:字符设备文件。b
:块设备文件。权限位:
r
(读)、w
(写)、x
(执行)。
r
:可读,值为 4
。w
:可写,值为 2
。x
:可执行,值为 1
。-
表示。例如:rwx
表示有读写执行权限,而 r-x
表示只有读和执行权限,无写权限。权限位置:
[文件类型] [属主权限] [属组权限] [其他用户权限]
- rwx r-x r--
-rw-r--r--
-
)。rw-
)。r--
)。r--
)。chmod
修改权限chmod
命令用于修改文件或目录的权限。
通过字母方式修改:
u
:表示属主(user)。g
:表示属组(group)。o
:表示其他用户(others)。a
:表示所有用户(all)。给所有用户添加写权限:
chmod a+w 文件名
给属组去掉执行权限:
chmod g-x 文件名
通过数字方式修改:
r=4
,w=2
,x=1
。设置权限为 rwxr-xr-x
(属主:读写执行,属组:读执行,其他用户:读执行):
chmod 755 文件名
设置权限为 rw-r--r--
(属主:读写,属组和其他用户:只读):
chmod 644 文件名
递归修改目录及其内容权限:
使用 -R
选项递归修改目录及其所有子目录和文件的权限。
chmod -R 755 目录名
chown
修改文件所有者chown
命令用于更改文件或目录的属主或属组。
修改文件的属主:
chown 用户名 文件名
示例:
chown alice test.txt
将 test.txt
的属主改为 alice
。
修改文件的属主和属组:
chown 用户名:组名 文件名
示例:
chown alice:developers test.txt
将 test.txt
的属主改为 alice
,属组改为 developers
。
递归修改目录及其内容的属主:
chown -R 用户名:组名 目录名
chgrp
修改文件属组chgrp
命令用于更改文件或目录的属组。
修改属组:
chgrp 组名 文件名
示例:
chgrp developers test.txt
将 test.txt
的属组改为 developers
。
递归修改目录及其内容的属组:
chgrp -R 组名 目录名
查看文件权限:
ls -l 文件名
将文件权限设置为仅属主可读写:
chmod 600 文件名
为目录及其子目录所有用户添加执行权限:
chmod -R a+x 目录名
修改文件属主为 root
,属组为 admin
:
chown root:admin 文件名
设置属主和属组为当前用户:
chown $(whoami):$(whoami) 文件名
给属组添加写权限:
chmod g+w 文件名
移除其他用户的所有权限:
chmod o-rwx 文件名
history
功能:查看当前用户的命令历史记录。
搭配 >
保存到文件:
history > history.txt
将命令历史记录保存到 history.txt
文件中。
vim .bash_history
功能:直接查看 .bash_history
文件(保存历史命令的文件)。
注意:如果历史记录还未写入磁盘(如未退出终端),可能无法在 .bash_history
中看到。
强制将内存中的历史记录写入磁盘:
history -w
find
命令基本语法:
find [搜索范围] [选项] [匹配条件]
-name
:按照文件名查找(支持通配符 *
)。
find / -name "*.txt" # 从根目录查找所有 .txt 文件
-user
:查找属于某个用户的文件。
find /home -user username
-size
:根据文件大小查找。
+
:大于指定大小。-
:小于指定大小。k
(千字节)。find / -size +100k # 查找大于 100KB 的文件
find / -size -1M # 查找小于 1MB 的文件
-type
:指定文件类型。
f
:普通文件。d
:目录。find /home -type d -name "test*" # 查找目录名以 test 开头的所有目录
-exec
:对查找到的文件执行操作。
find / -name "*.log" -exec rm {} \; # 删除所有 .log 文件
{}
代表查找到的文件名,\;
表示命令结束。
|
过滤包含特定关键字的文件或目录:
ls | grep "test"
输出当前目录中包含 test
的文件或目录。
显示行号 -n
:
ls | grep -n "test"
输出包含 test
的文件或目录,并显示匹配的行号。
反过滤 -v
grep -v grep
/
查找关键字在 vim
编辑器中,可以按 /
然后输入关键字,进行查找:
/关键字
n
跳转到下一个匹配项,按 N
跳转到上一个匹配项。grep
命令作用:在文件内容中查找匹配的关键字。
基本语法:
grep [选项] "关键字" 文件名
-n
:显示匹配的行号。
grep -n "关键字" 文件名
-i
:忽略大小写。
grep -i "error" log.txt
-r
:递归搜索目录下所有文件。
grep -r "TODO" /home/user/project
--color
:高亮显示匹配的关键字(很多系统默认开启)。
grep --color "关键字" 文件名
tar
命令tar
命令是 Linux 中常用的打包工具,它可以用来创建归档文件(压缩)和解压归档文件(解压)。
创建压缩文件:
tar -czvf archive.tar.gz /path/to/directory
-c
:创建新的归档文件-z
:使用 gzip 压缩-v
:显示压缩过程-f
:指定压缩文件的名称示例:将目录 /home/user
压缩成 archive.tar.gz
tar -czvf archive.tar.gz /home/user
解压压缩文件:
tar -xzvf archive.tar.gz
-x
:解压归档文件-z
:使用 gzip 解压-v
:显示解压过程-f
:指定解压文件的名称示例:解压 archive.tar.gz
文件
tar -xzvf archive.tar.gz
仅查看压缩文件内容:
tar -tzvf archive.tar.gz
仅解压某个文件到当前目录:
tar -xzvf archive.tar.gz -C path/to/file
gzip
命令gzip
命令用于压缩单个文件。
压缩文件:
gzip filename
该命令会将 filename
压缩为 filename.gz
,并删除原文件。如果想保留原文件,可以使用 -k
选项:
gzip -k filename
解压文件:
gzip -d filename.gz
或者使用 gunzip
命令:
gunzip filename.gz
gunzip
命令gunzip
是 gzip
的解压命令,用于解压 .gz
格式的压缩文件。
解压 .gz
文件:
gunzip filename.gz
该命令会解压 filename.gz
并删除原来的压缩文件,解压后的文件将是 filename
。
保留压缩文件: 如果你希望解压文件时保留 .gz
压缩文件,可以使用 -k
选项:
gunzip -k filename.gz
这会解压文件,但保留 filename.gz
文件。
解压多个文件: 如果你有多个 .gz
文件,可以一次性解压它们:
gunzip file1.gz file2.gz file3.gz
解压到指定目录: gunzip
本身不支持指定目标目录,但你可以通过 -c
选项将解压内容输出到标准输出,并将它重定向到指定目录。例如:
gunzip -c filename.gz > /path/to/destination/filename
zip
和 unzip
命令zip
和 unzip
用于创建和解压 .zip
格式的文件。
压缩文件/目录:
zip -r archive.zip /path/to/directory_or_files
-r
:递归压缩目录示例:将目录 /home/user
压缩成 archive.zip
zip -r archive.zip /home/user
解压 .zip
文件:
unzip archive.zip
unzip archive.zip -d /path/to/destination
7z
命令(7-Zip)7z
命令是 7zip
工具的命令行工具,支持多种格式的压缩和解压。
压缩文件/目录:
7z a archive.7z /path/to/directory_or_files
a
:添加文件到压缩档案示例:将目录 /home/user
压缩成 archive.7z
7z a archive.7z /home/user
解压 .7z
文件:
7z x archive.7z
xz
命令xz
是一种高压缩比的压缩工具,常用于 Linux 系统中。
压缩文件:
xz filename
该命令会将 filename
压缩为 filename.xz
,并删除原文件。如果想保留原文件,可以使用 -k
选项:
xz -k filename
解压文件:
xz -d filename.xz
或者使用 unxz
命令:
unxz filename.xz
tar
:适合打包和压缩(支持 .tar.gz
、.tar.bz2
等格式)gzip
:适用于压缩单个文件(通常与 tar
配合使用)gunzip
:用于解压 .gz
文件zip
:用于 .zip
文件格式,支持压缩多个文件或目录7z
:高压缩比,支持多种格式xz
:高压缩比,但压缩速度较慢,适合大文件lsblk
:查看磁盘设备及其分区结构
lsblk
输出中会显示磁盘设备的挂载点、容量、分区等信息。
fdisk -l
:列出所有磁盘及其分区信息
fdisk -l
输出中包含磁盘的详细信息,包括设备名称、大小、分区类型等。
df -h
:查看文件系统磁盘使用情况
df -h
-h
:以人类可读的格式显示(单位为 GB、MB 等)。进入磁盘分区工具:
fdisk /dev/sdX
其中 /dev/sdX
是磁盘设备名称(如 /dev/sda
)。可以通过 lsblk
或 fdisk -l
确定。
常用操作:
m
查看帮助。p
显示当前分区表。n
创建新分区。d
删除分区。t
修改分区类型。w
保存并退出。q
退出不保存。格式化为指定的文件系统:
mkfs -t ext4 /dev/sdX1
-t
:指定文件系统类型(如 ext4
, xfs
, ntfs
等)。/dev/sdX1
是目标分区(如 /dev/sda1
)。示例:格式化 /dev/sda1
为 ext4
文件系统
mkfs -t ext4 /dev/sda1
挂载分区到目录:
mount /dev/sdX1 /mnt
示例:将 /dev/sda1
挂载到 /mnt
目录
mount /dev/sda1 /mnt
卸载分区:
umount /mnt
示例:卸载 /mnt
挂载点
umount /mnt
查看挂载情况:
mount
或者:
df -h
调整分区大小:
使用 resize2fs
工具调整文件系统大小(仅支持 ext2/ext3/ext4
文件系统)。
示例:扩展 /dev/sda1
的文件系统
resize2fs /dev/sda1
检查和修复文件系统:
fsck /dev/sdX1
fsck
是文件系统检查工具,用于检测并修复文件系统错误。parted
工具parted
是更高级的分区管理工具,支持 GPT 和 MBR 分区表。
查看磁盘信息:
parted /dev/sdX print
创建新分区:
parted /dev/sdX mkpart primary ext4 1MiB 10GiB
示例:创建一个 ext4
类型的主分区,从 1MiB 开始,到 10GiB 结束。
设置分区表类型:
parted /dev/sdX mklabel gpt
gpt
:设置为 GPT 分区表。msdos
:设置为 MBR 分区表。每个分区都有唯一的标识符(UUID),可以通过以下命令查看:
blkid
输出示例:
/dev/sda1: UUID="1234abcd-5678-efgh-ijkl-9876mnopqrst" TYPE="ext4"
编辑 /etc/fstab
文件,添加以下内容:
UUID=1234abcd-5678-efgh-ijkl-9876mnopqrst /mnt ext4 defaults 0 0
UUID
和挂载点 /mnt
为实际值。ext4
为文件系统类型。添加后,可以通过以下命令立即生效:
mount -a
lsblk
、fdisk -l
fdisk
、parted
mkfs
mount
、umount
resize2fs
、fsck
/etc/fstab
ps
:显示当前进程状态
ps aux
:列出所有进程的信息(不管是否在当前终端)
ps aux
a
:显示所有用户的进程u
:显示进程的详细信息(如用户名、CPU 使用、内存使用等)x
:显示没有控制终端的进程(即后台进程)ps -ef
:显示进程树及更多详细信息
ps -ef
-e
:列出所有进程-f
:显示完整格式,包括父进程(PPID)、进程启动时间等信息top
:实时显示系统中进程的动态信息
top
top
会显示 CPU、内存占用、进程状态等动态变化的信息。q
退出 top
。top
中按 P
按 CPU 使用率排序,按 M
按内存使用排序。htop
:一个比 top
更为友好的进程监视工具(需要安装)
htop
htop
提供了更直观的界面和更多交互操作功能。F9
可以终止进程。pgrep
:根据进程名称查找进程的 PID
pgrep process_name
示例:查找 nginx
进程的 PID
pgrep nginx
pidof
:获取某个程序的 PID
pidof process_name
示例:查找 firefox
的 PID
pidof firefox
kill
:终止指定进程
kill PID
示例:终止 PID 为 1234
的进程
kill 1234
SIGTERM
信号(优雅地终止进程)。kill -9 PID
:强制终止进程(发送 SIGKILL
信号)。killall
:根据进程名终止进程
killall process_name
示例:终止所有 nginx
进程
killall nginx
ps -L
:显示进程的线程信息
ps -L -p PID
-L
:显示线程信息-p
:指定进程 ID(PID)nice
:启动新进程并设置其优先级
nice -n 10 command
-n 10
:设置优先级为 10(负值优先级较高,正值优先级较低)。renice
:修改已有进程的优先级
renice -n 10 -p PID
示例:修改 PID 为 1234
的进程优先级为 10
renice -n 10 -p 1234
strace
:跟踪系统调用和信号
strace -p PID
示例:监视进程 PID=1234
的系统调用
strace -p 1234
查看当前用户的定时任务
crontab -l
编辑定时任务
crontab -e
该命令会打开当前用户的 crontab 文件,用于设置或编辑定时任务。
删除当前用户的所有定时任务
crontab -r
定时任务的时间格式为:
* * * * * command
│ │ │ │ │
│ │ │ │ └─ 星期(0 - 7) 0和7代表周日
│ │ │ └─── 月(1 - 12)
│ │ └───── 日(1 - 31)
│ └─────── 时(0 - 23)
└───────── 分(0 - 59)
例如:
30 2 * * 1 /home/user/script.sh
这表示每周一凌晨 2:30 执行 /home/user/script.sh
。
在 cron 表的每一列中,你可以使用以下符号来表示不同的时间规则:
星号(*
):表示任意值(每个可能的值)。
逗号(,
):用来指定多个值。你可以用逗号分隔多个值,表示任务在这些值上执行。
1,15,30,45
表示“在第 1、15、30、45 分钟执行”。短横线(-
):指定一个范围。
1-5
表示从第 1 天到第 5 天,或者从 1 点到 5 点等。斜杠(/
):表示步长,指定间隔执行的时间。
*/10
表示“每隔 10 分钟执行一次”。问号(?
):仅用于 日
和 星期
字段,表示没有特定的值。问号通常用在你已经在其他字段指定了具体值时,用来表示“无关的值”。
日
字段指定了某一天,而不关心星期几,可以在 星期
字段使用 ?
。L:表示“最后”。
L
在星期字段中表示“最后一天”(即每月最后一天),在日字段中表示“最后一个周几”。W:表示“最接近指定日期的工作日”。
15W
表示最接近每月 15 日的工作日(即周一至周五)。#:表示“每月的第几个星期几”。
2#1
表示每月的第一个周二。(在月位置写)要查看系统中所有用户的定时任务,可以查看 /var/spool/cron/crontabs
目录下的文件。
cat /var/spool/cron/crontabs/username
系统级的定时任务文件通常位于 /etc/crontab
和 /etc/cron.d/
。
/etc/crontab
格式略有不同,包含了用户字段:
* * * * * user command
at
命令用于安排一次性任务,它不会像 cron 那样定期执行。
查看已安排的任务
atq
添加一次性任务
echo "command" | at 14:00
示例:在今天 14:00 执行 command
。
删除已安排的任务
atrm job_id
其中 job_id
是任务的 ID,可以通过 atq
获取。
cron.daily
、cron.weekly
和 cron.monthly
: 系统有一些目录专门用于定期执行任务,如 /etc/cron.daily/
、/etc/cron.weekly/
、/etc/cron.monthly/
。 可以将脚本放入这些目录中,系统会自动按日、周、月执行它们。vi
或 vim 文件
:打开文件dd
:删除光标当前行dnd
:删除n行(删除当前行及其后n-1行)u
:撤销上一步操作x
/ X
:删除当前光标处的字母(x
删除光标后的字符,X
删除光标前的字符)yy
:复制光标当前行p
:粘贴(粘贴到光标后)dw
:删除一个词yw
:复制一个词gg
:移动到文件的开头G
:移动到文件的结尾数字 + G
:移动到指定的行(如 10G
移动到第10行)^
:移动到当前行的开头$
:移动到当前行的结尾ZZ
:保存并退出(等同于 :wq
)i
:在当前光标前进入插入模式a
:在当前光标后进入插入模式o
:在当前行的下一行插入新行并进入编辑模式s
,S
:s
删除当前字符并进入编辑模式,S
删除整行并进入编辑模式R
:进入替换模式(按下键后可以替换当前字符)Esc
:退出编辑模式,回到普通模式:
进入命令模式:w
:保存文件:q
:退出文件:wq
:保存并退出:q!
:强制退出,不保存修改:%s/旧内容/新内容/g
:替换文件中所有的旧内容为新内容/要查找的词
:向下查找指定词,n
跳到下一个,N
跳到上一个:noh
:取消搜索高亮显示:set nu
:显示行号:set nonu
:不显示行号hostname
:查看当前主机名
sudo vim /etc/hostname
:编辑主机名文件来修改主机名
还需要修改 /etc/hosts
文件,确保主机名与本地 IP 地址映射正确:
sudo vim /etc/hosts
# 添加类似以下内容
127.0.0.1 localhost
127.0.1.1 新主机名
通过 ping 新主机名
可以检查主机名是否正确映射到 IP 地址
.swp
结尾),包含未保存的内容。你可以使用 ls -a
查看这些文件。:e!
强制重新加载文件,或者使用 :q!
强制退出。s
工具简介
RPM 是 Linux 系统中常用的包管理工具,类似于 Windows 中的 .exe
安装程序,用于软件的安装、卸载、升级和查询。适用于基于 Red Hat 的 Linux 发行版(如 CentOS、RHEL 等)。
RPM 包名称格式
RPM 包的命名通常遵循以下格式:
--..rpm
RPM 查询命令
查询所有已安装软件包:
rpm -qa
查询指定包是否安装:
rpm -q <package-name>
查询包详细信息:
rpm -qi <package-name>
查询文件所属软件包:
rpm -qf <file-path>
查询包安装路径:
rpm -ql <package-name>
RPM 安装命令
安装 RPM 包:
sudo rpm -ivh <package-file>.rpm
-i
:安装-v
:显示详细信息-h
:显示进度条RPM 卸载命令
卸载软件包:
sudo rpm -e <package-name>
若忽略依赖卸载:
sudo rpm -e --nodeps <package-name>
RPM 更新命令
更新或升级 RPM 包:
sudo rpm -Uvh <package-file>.rpm
RPM 验证命令
验证已安装包的完整性:
sudo rpm -V <package-name>
工具简介
YUM 是基于 RPM 的包管理工具,能自动处理依赖,简化软件安装和更新过程。
YUM 常用命令
安装软件包:
sudo yum -y install <package-name>
更新软件包:
sudo yum update <package-name>
删除软件包:
sudo yum remove <package-name>
查询软件包:
sudo yum list <package-name>
搜索软件包:
sudo yum search <package-name>
YUM 仓库配置
配置文件路径:/etc/yum.repos.d/
常见仓库:
推荐安装方式
使用官方提供的 .tar.gz
包或自定义安装路径,避免依赖冲突。
下载 JDK 压缩包,例如 jdk-17.0.13_linux-x64_bin.tar.gz
。
解压到指定目录:
tar -zxvf jdk-17.0.13_linux-x64_bin.tar.gz -C /opt
解压后,JDK 的路径为 /opt/jdk-17
。
配置环境变量
创建环境变量配置文件:
sudo vim /etc/profile.d/my_env.sh
添加以下内容:
# JAVA_HOME
JAVA_HOME=/opt/jdk-17
PATH=$PATH:$JAVA_HOME/bin
立即生效:
source /etc/profile.d/my_env.sh
验证安装
验证 JDK 安装是否成功:
java -version
若输出 JDK 的版本信息,则表示安装成功。
Docker 是一个开源的容器化平台,帮助开发者和运维工程师构建、运行、测试和部署应用程序。Docker 将应用程序及其所有依赖打包到一个独立的容器中,保证一致的运行环境。
设置阿里云镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker 引擎
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动 Docker
sudo systemctl start docker
验证安装
docker -v
编辑配置文件:
vi /etc/docker/daemon.json
添加以下内容:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://docker.m.daocloud.io"
],
"live-restore": true
}
重启 Docker 服务:
systemctl daemon-reload
service docker restart
验证配置是否生效:
docker info
下载 Docker Compose 二进制文件:
curl -L https://github.com/docker/compose/releases/download/1.28.6/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加执行权限:
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
docker-compose --version
Docker Compose 可以通过定义 docker-compose.yml
文件,直观地初始化服务。例如,安装 MySQL 服务:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_container
environment:
MYSQL_ROOT_PASSWORD: yourpassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
运行服务:
docker-compose up -d
docker正常启动的参数:
-d 后台运行容器;
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
--hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;
为了确保 MySQL 数据能够持久化存储,我们需要在主机上创建数据目录和配置目录。这样,无论容器是否删除,数据和配置都会保留在宿主机上。
# 创建 MySQL 数据存储目录
mkdir -p /data/mysql/data
# 创建 MySQL 配置文件目录
mkdir -p /data/mysql/conf
我们将自定义的 MySQL 配置文件 my.cnf
挂载到 Docker 容器中。这样可以避免使用默认配置,同时根据实际需要调整 MySQL 参数(如字符集、存储引擎、连接数等)。
创建自定义 MySQL 配置文件:
# 编辑自定义的 my.cnf 配置文件
vim /data/mysql/conf/my.cnf
my.cnf 配置示例:
[mysqld]
# 默认存储引擎设置为 InnoDB
default-storage-engine=INNODB
# 设置 MySQL 服务端默认字符集为 utf8mb4
character-set-server=utf8mb4
# 设置 MySQL 服务端的 pid 文件路径
pid-file = /var/run/mysqld/mysqld.pid
# 设置 MySQL 服务端的 socket 路径
socket = /var/run/mysqld/mysqld.sock
# 设置 MySQL 数据文件的存储路径
datadir = /var/lib/mysql
# 禁用符号链接
symbolic-links=0
# 设置 MySQL 使用的 SQL 模式
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 设置最大连接数
max_connections = 200
# MySQL 主从同步配置:设置唯一的 server-id
server-id = 3306
# 开启二进制日志
log-bin = /var/lib/mysql/mysql-bin
# 设置二进制日志格式:ROW(基于行的日志格式)
binlog_format = ROW
# 设置二进制日志文件记录的内容
binlog_row_image = FULL
# 设置二进制日志最大文件大小
max_binlog_size = 100M
# 设置过期的二进制日志自动删除时间(单位:天)
expire_logs_days = 7
[mysql]
# 客户端默认字符集
default-character-set=utf8mb4
[client]
# 客户端默认字符集
default-character-set=utf8mb4
使用 Docker Compose 来管理 MySQL 容器,确保 MySQL 容器使用我们创建的配置文件,同时进行数据的持久化存储。
创建 docker-compose.yml
配置文件:
# 编辑 Docker Compose 配置文件
vim /data/mysql/docker-compose.yml
docker-compose.yml 配置示例:
version: '3'
services:
mysql:
image: mysql:8.0 # 使用 MySQL 8.0 镜像
container_name: mysql # 容器名称
restart: always # 容器失败自动重启
ports:
- "3366:3306" # 映射本地端口 3366 到容器的 3306
environment:
MYSQL_ROOT_PASSWORD: 123456 # 设置 MySQL root 密码
TZ: Asia/Shanghai # 设置时区为上海
volumes:
- /data/mysql/data:/var/lib/mysql # 持久化存储 MySQL 数据
- /data/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf # 挂载自定义配置文件
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置字符集
完成上述配置后,通过 Docker Compose 启动 MySQL 容器。进入到配置目录并运行启动命令:
# 进入配置目录
cd /data/mysql
# 启动 MySQL 容器
docker-compose up -d
这样,MySQL 容器会在后台启动,并使用我们自定义的配置文件。
# 创建 Redis 数据存储目录
mkdir -p /data/redis
docker-compose.yml
配置文件创建 Redis 的 Docker Compose 配置文件,并指定容器的配置文件和数据挂载路径。
# 编辑 Docker Compose 配置文件
vim /data/redis/docker-compose.yml
docker-compose.yml 配置示例:
version: '3'
services:
redis:
image: redis:7.2.3
container_name: redis
restart: always
ports:
- "6399:6379" # 映射本地端口 6399 到容器的 6379
volumes:
- /data/redis/redis.conf:/etc/redis/redis.conf # 挂载自定义配置文件
- /data/redis/data:/data # 持久化存储 Redis 数据
- /data/redis/logs:/logs # 持久化存储 Redis 日志
command: ["redis-server", "/etc/redis/redis.conf"] # 使用自定义配置文件启动 Redis
编辑 Redis 配置文件 /data/redis/redis.conf
,并根据需要配置相关项。
# 编辑 Redis 配置文件
vim /data/redis/redis.conf
redis.conf 配置示例:
protected-mode no
port 6379
timeout 0
# RDB 配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
# AOF 配置
appendonly yes
appendfsync everysec
# 设置 Redis 密码
requirepass 123456
使用 Docker Compose 启动 Redis 容器:
# 进入配置目录
cd /data/redis
# 启动 Redis 容器
docker-compose up -d
# 如果需要强制重新构建容器
docker-compose up --force-recreate -d
# 拉取 RabbitMQ 镜像
docker pull rabbitmq
# 启动 RabbitMQ 容器
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
# 进入容器内部
docker exec -it 容器id /bin/bash
# 启用 RabbitMQ 管理插件
rabbitmq-plugins enable rabbitmq_management
在 RabbitMQ 管理界面,进入 Admin 页面,启用所有的 “Feature Flags”。
# 进入容器内部
docker exec -it 容器id /bin/bash
# 进入配置目录
cd /etc/rabbitmq/conf.d/
# 修改配置
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
# 退出容器
exit
# 重启容器
docker restart 容器id
# 进入容器内部
docker exec -it 容器id /bin/bash
# 查看用户表
rabbitmqctl list_users
# 修改密码
rabbitmqctl change_password 用户名 '[密码]'
首先创建挂载目录来存储 Minio 数据和配置:
mkdir -p /data/minio
docker-compose.yml
配置文件在 /data/minio/
目录下创建 docker-compose.yml
配置文件,内容如下:
version: '3'
services:
minio:
image: "minio/minio"
container_name: minio
ports:
- "9000:9000" # Minio API 端口
- "9001:9001" # Minio 控制台端口
environment:
MINIO_ROOT_USER: admin # 管理后台用户名
MINIO_ROOT_PASSWORD: 12345678 # 管理后台密码,至少8个字符
MINIO_COMPRESS: "off" # 开启压缩 "on" 或 "off"
MINIO_COMPRESS_EXTENSIONS: "" # 需要压缩的扩展名 (例如 .pdf,.doc),为空表示所有文件类型均压缩
MINIO_COMPRESS_MIME_TYPES: "" # 需要压缩的 MIME 类型 (例如 application/pdf),为空表示所有 MIME 类型均压缩
volumes:
- /data/minio/data:/data/ # 映射数据目录
- /data/minio/config:/root/.minio/ # 映射配置目录
command: server --address ':9000' --console-address ':9001' /data # 启动 Minio,指定容器中的数据目录
privileged: true
进入到 /data/minio/
目录,执行以下命令来启动 Minio 容器:
cd /data/minio
docker-compose up -d # 启动容器
如果需要强制重新构建容器:
docker-compose up --force-recreate -d # 强制重建容器
在 Minio 中配置 Bucket 权限。以下是一个示例 JSON 策略,允许所有用户访问 blog
Bucket 中的内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": [ "*" ] },
"Action": [ "s3:GetBucketLocation" ],
"Resource": [ "arn:aws:s3:::blog" ]
},
{
"Effect": "Allow",
"Principal": { "AWS": [ "*" ] },
"Action": [ "s3:ListBucket" ],
"Resource": [ "arn:aws:s3:::blog" ],
"Condition": {
"StringEquals": { "s3:prefix": [ "*" ] }
}
},
{
"Effect": "Allow",
"Principal": { "AWS": [ "*" ] },
"Action": [ "s3:GetObject" ],
"Resource": [ "arn:aws:s3:::blog/**" ]
}
]
}
这个权限策略允许所有用户获取 blog
Bucket 的位置、列出该 Bucket 的内容,并读取其中的对象。
登录到 Minio 控制台 (http://
),使用管理员账号 (admin/12345678
) 登录,创建新的 Access Key 和 Secret Key,以便用于应用程序访问 Minio 服务。
cat /etc/shells
命令查看系统中可用的 Shell 解释器。sh
通常是一个软连接,指向 bash
或其他 Shell。可以使用 ls -l /bin/sh
命令查看 sh
是否指向 bash
。在脚本文件的开头加入 #!/bin/bash
,这是约定俗成的标准,用来指定脚本使用的解释器。
第一种方法: 通过 bash 文件名
或 sh 文件名
来执行脚本。
第二种方法:给脚本文件添加可执行权限 chmod +x 文件名
,然后通过相对路径或绝对路径直接执行脚本。
第三种方法:使用 source 文件名
或 . 文件名
来执行脚本,这种方式无需可执行权限,且脚本会在当前 Shell 环境中执行,能继承脚本中的变量。
A=5
,并通过 echo $A
来输出变量值。source
或 .
执行脚本,脚本中的变量将被继承到当前的 Shell 环境中。否则,如果直接执行脚本,变量只在子 Shell 中有效,脚本执行完毕后变量失效。source
和 .
的区别使用 source
或 .
执行脚本时,脚本内容会在当前 Shell 中执行,并且会影响当前 Shell 的环境(例如变量、函数等)。这种方法适用于需要在当前 Shell 环境中修改或继承脚本中的变量和设置。
直接执行脚本(如 bash 文件名
)会在子 Shell 中执行脚本,脚本结束后,子 Shell 会退出,所有修改的环境变量等都会丢失。
常用系统变量:通常全大写,如 $HOME
(用户的家目录)、$PWD
(当前工作目录)、$SHELL
(当前 Shell 类型)、$USER
(当前用户)等。
显示当前 Shell 所有变量:使用 set
命令。
自定义变量:
unset 变量名
来撤销变量。声明静态变量:
使用 readonly 变量名=变量值
来声明只读变量,该变量无法被 unset
。只读变量仅在当前窗口有效,重新打开一个窗口时,它不再存在。
变量名规则:
变量名可以由字母、数字和下划线组成,环境变量建议使用大写字母,且不能以数字开头。
字符串和数值运算:
"I am"
。提升为全局环境变量:使用 export 变量名
将变量提升为全局环境变量,供其他 Shell 程序使用。
示例:创建脚本 a.sh
#!/bin/bash
echo $VAR
外面要export VAR=5
$n(n 为数字):$0
表示脚本名称,$1
到 $9
表示脚本传入的参数,第 10 个及以上的参数需要用 ${n}
包裹。
传参执行脚本:例如,执行 ./a.sh aaa "cac a" a
,其中 $1 = aaa
,$2 = cac a
,$3 = a
。
$#:获取传入脚本的参数个数。
$*:表示所有的参数,将所有参数当作一个整体。
$@:表示所有的参数,但每个参数会被单独区分。
$?:表示上一个命令的退出状态码,0
表示命令正常执行,非 0
表示异常。
在 Shell 脚本中,常用的运算符有以下几种:
Shell 支持两种语法来进行算术运算:
((运算式))
功能相同,但较为旧式,现在推荐使用 ((运算式))
。示例:
# 使用 $(( )) 进行算术运算
result=$((3 + 5))
echo $result # 输出 8
# 使用 $[ ] 进行算术运算
result=$[3 + 5]
echo $result # 输出 8
在 Shell 中,使用条件判断来执行不同的代码块。常见的条件判断语法包括:
test condition
用于测试条件是否为真,条件成立时返回 0。
test condition
[ condition ]
与 test
相同,通常使用 []
来进行条件判断,[]
前后需要有空格。
[ condition ]
-eq
:等于(equal)-ne
:不等于(not equal)-lt
:小于(less than)-le
:小于等于(less equal)-gt
:大于(greater than)-ge
:大于等于(greater equal)示例:
[ 23 -ge 22 ] # 判断 23 是否大于等于 22
echo $? # 输出 0 表示为真,1 表示为假
-r
:文件可读(read)-w
:文件可写(write)-x
:文件可执行(execute)示例:
[ -x 1.txt ] # 判断文件 1.txt 是否有执行权限
echo $? # 输出 0 表示为真,1 表示为假
-e
:文件是否存在(existence)-f
:是否为普通文件(file)-d
:是否为目录(directory)示例:
[ -e 1.txt ] # 判断文件 1.txt 是否存在
echo $? # 输出 0 表示为真,1 表示为假
if
判断if
用于根据条件判断执行不同的语句。
if
判断if [ condition ]; then
# 执行语句
fi
if
判断(elif
)if [ condition1 ]; then
# 执行语句1
elif [ condition2 ]; then
# 执行语句2
else
# 执行语句3
fi
示例:
if [ -f "file.txt" ]; then
echo "file.txt 是一个普通文件"
elif [ -d "file.txt" ]; then
echo "file.txt 是一个目录"
else
echo "file.txt 不存在"
fi
case
判断case
用于多分支判断,比 if
更简洁,适用于多种情况的判断。
case "$variable" in
pattern1)
# 执行语句1
;;
pattern2)
# 执行语句2
;;
*)
# 默认执行语句
;;
esac
示例:
case "$1" in
start)
echo "启动程序"
;;
stop)
echo "停止程序"
;;
restart)
echo "重启程序"
;;
*)
echo "无效命令"
;;
esac
for
循环for
循环用于固定次数的迭代,通常用来遍历一组元素或执行某些任务一定次数。
for var in list
do
# 执行语句
done
var
:循环变量,每次迭代时取 list
中的一个值。list
:可以是数值范围、文件名列表或其他集合。for i in {1..5}
do
echo "第 $i 次循环"
done
for file in *.txt
do
echo "文件名:$file"
done
该示例遍历当前目录下所有 .txt
文件,并打印每个文件的名字。
for color in red green blue
do
echo "颜色是:$color"
done
colors=("red" "green" "blue")
for color in "${colors[@]}"
do
echo "颜色是:$color"
done
while
循环while
循环用于在给定的条件为真时重复执行某个命令或语句,直到条件为假时停止。
while [ condition ]
do
# 执行语句
done
condition
:条件表达式,若为真(返回值为0)则执行循环体,否则退出循环。i=1
while [ $i -le 5 ]
do
echo "第 $i 次循环"
((i++)) # i自增1
done
echo "请输入一个数字(输入0退出):"
while read num
do
if [ $num -eq 0 ]; then
echo "退出程序"
break
fi
echo "你输入的是:$num"
echo "请输入一个数字(输入0退出):"
done
该示例会反复提示用户输入数字,直到输入 0
为止。
while true
do
echo "这将一直输出,直到手动终止"
done
该循环会无限执行,直到你手动中断(例如使用 Ctrl+C
)。
for
循环中的 (( ))
语法(算术操作)for
循环不仅支持列表迭代,还可以结合 (( ))
进行算术运算,用于处理数值的增加、减少等。
for ((i=初始值; i<=终止值; i++))
do
# 执行语句
done
for ((i=1; i<=5; i++))
do
echo "第 $i 次循环"
done
read
命令基本语法**read
命令用于从标准输入读取用户输入的内容,并将其保存到指定的变量中。
read [选项] [变量]
-p
:指定提示信息,显示在用户输入前。-t
:指定读取输入的超时时间(单位:秒),超时后不再等待输入。#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds: " NAME
echo $NAME
#!/bin/bash
:指定脚本的解释器为 Bash。read -t 7 -p "Enter your name in 7 seconds: "
:提示用户输入姓名,给出 7 秒的时间限制。NAME
:用户输入的内容将存储在 NAME
变量中。echo $NAME
:输出用户输入的姓名。-t 7
:给用户 7 秒的时间输入姓名。-p
:提供输入提示信息 "Enter your name in 7 seconds: "
。NAME
变量将为空,脚本会继续执行并输出空字符串。basename
命令用于从指定路径中去掉路径的前缀部分,只保留文件名或目录名。如果指定了后缀,basename
会从文件名中去除该后缀。
basename [string / pathname] [suffix]
string / pathname
:指定的路径或字符串。suffix
:可选参数,用于去除文件名的后缀部分。如果指定了 suffix
,basename
会去除 string
或 pathname
的后缀。basename
会删除路径中的前缀部分(直到最后一个 /
),返回路径中的文件名。suffix
,basename
会去除文件名中的指定后缀。获取文件名:
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt
banzhang.txt
去除文件后缀: 如果指定了 .txt
后缀,basename
会去掉它:
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt .txt
banzhang
/
结尾,basename
会去掉该 /
。basename
常用于提取文件名而不包括路径部分,尤其在脚本中处理文件路径时非常有用。dirname
命令用于从指定路径中去掉文件名部分,返回路径中的目录部分。
dirname pathname
pathname
:指定的完整路径。dirname
会去掉路径中的文件名部分,只保留路径中的目录部分。获取文件路径:
[atguigu@hadoop101 datas]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
dirname
是用于提取路径的目录部分,常与 basename
搭配使用,用于提取文件名和路径。[function] funname() {
# 执行的操作
[return int]
}
function
(可选):你可以选择是否使用 function
关键字来定义函数,实际效果相同。funname
:自定义的函数名称。{}
:函数体,包含一系列的操作或命令。[return int]
(可选):函数的返回值。返回值通常是一个整数,表示函数的执行结果。函数定义顺序:在调用函数之前,必须先定义函数。Shell 脚本是逐行执行的,和其他编程语言不同,它不会提前进行编译。因此,函数必须在调用之前被定义。
返回值:函数只能返回一个整数值,通常是通过 return
关键字返回。返回值的范围通常是 0-255
,其中 0
表示成功,其他值表示不同的错误或状态。
计算两个输入参数的和,并返回结果。
#!/bin/bash
# 定义一个函数,计算两个数字的和
add_numbers() {
local sum=$(( $1 + $2 ))
return $sum # 返回计算结果
}
# 调用函数并传递两个参数
add_numbers 5 3
# 获取函数的返回值
result=$?
echo "The sum is: $result"
add_numbers
函数计算两个数字的和。add_numbers 5 3
,传递参数 5
和 3
。$?
获取函数的返回值,这里返回的是 sum
的值。说明:
local
用于局部变量,保证该变量只在函数内有效,避免影响外部变量。return
只能返回整数值,通常用来表示操作的状态或者返回计算结果。echo
输出结果如果需要返回更复杂的结果,可以使用 echo
输出,而不是使用 return
。例如:
#!/bin/bash
# 定义函数,返回一个字符串
greet_user() {
echo "Hello, $1!"
}
# 调用函数并获取输出
greeting=$(greet_user "Alice")
echo $greeting
在这个示例中,greet_user
函数输出一个问候语,调用时将其结果存储在 greeting
变量中。
cut
命令用于从文件中提取某些列、字节或者字符。常用于处理格式良好的数据,如 CSV 文件、日志文件等。
cut [选项参数] filename
选项 | 功能 |
---|---|
-f |
指定要提取的字段(列)。 |
-d |
指定字段的分隔符(默认是制表符)。 |
-c |
按字符位置切割,指定字符的范围。 |
按空格分隔提取字段
提取第一列:
cut -d ' ' -f 1 cut.txt
输出:dong
提取第二列:
cut -d ' ' -f 2 cut.txt
输出:shen
按字符提取
提取第一个字符:
cut -c 1 cut.txt
输出:d
提取第一个到第三个字符:
cut -c 1-3 cut.txt
输出:don
提取系统 PATH 环境变量中的路径
echo $PATH | cut -d ":" -f 3-
输出:
/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin
awk
是一个强大的文本处理工具,可以用于模式扫描和数据处理。
awk [选项参数] '/pattern/{action}' filename
选项 | 功能 |
---|---|
-F |
指定输入文件的分隔符。 |
-v |
定义外部变量。 |
变量 | 说明 |
---|---|
FILENAME |
当前文件名。 |
NR |
已读取的行号。 |
NF |
当前行的字段数。 |
统计字段数
awk -F : '{print $1, NF}' passwd
输出:
root 7
daemon 7
bin 7
sys 7
查找空行并打印行号
awk '/^$/ {print NR}' ifconfig
输出:
9
18
26
使用 -v
选项传递变量
awk -F : -v user="root" '$1 == user {print $1, $7}' passwd
输出:
root /bin/bash
wc
用于统计文件的行数、单词数、字节数、字符数等。
wc [选项] 文件名
选项 | 功能 |
---|---|
-l |
统计行数 |
-w |
统计单词数 |
-m |
统计字符数 |
-c |
统计字节数 |
统计行数、单词数、字符数
wc -l /etc/profile # 行数
wc -w /etc/profile # 单词数
wc -m /etc/profile # 字符数
组合使用选项
wc -lwc /etc/profile
统计多个文件
wc -lw file1.txt file2.txt
sort [选项] 文件列表
选项 | 功能描述 |
---|---|
-n |
按数值大小排序 |
-r |
反向排序(降序) |
-t |
指定字段分隔符(默认制表符) |
-k |
指定排序的关键列(字段位置) |
按数值降序排序
sort -t : -nrk 2 sort.txt
输出:
xz:50:2.3
bb:40:5.4
bd:20:4.2
cls:10:3.5
多列排序
sort -k 2,3 sort.txt
去重排序
sort -u sort.txt
混合排序
sort -k 2n -k 3r sort.txt
正则表达式(Regular Expression)
通过特定语法规则构成的字符序列,主要用于:
Linux三剑客支持:
grep # 文本搜索
sed # 流编辑器
awk # 文本分析
grep ‘atguigu’ /etc/passwd # 匹配包含"atguigu"的整行
字符 | 功能 | 示例 |
---|---|---|
^ |
匹配行首 | grep '^a' file |
$ |
匹配行尾 | grep 't$' file |
^$ |
匹配空行 | grep '^$' file |
元字符 | 功能 | 示例 |
---|---|---|
. |
匹配任意单个字符 | grep 'a.c' file |
* |
前导字符出现0次或多次 | grep 'ab*c' file |
+ |
前导字符出现1次或多次 | grep -E 'ab+c' file |
? |
前导字符出现0次或1次 | grep -E 'ab?c' file |
{n} |
精确匹配n次 | grep -E 'a{3}' file |
{n,m} |
匹配n到m次 | grep -E 'a{2,4}' file |
{n,} |
匹配至少n次 | grep -E 'a{3,}' file |
表达式 | 功能 | 示例 |
---|---|---|
[abc] |
匹配集合内任意字符 | grep '[AT]om' file |
[^abc] |
排除集合内字符 | grep '[^0-9]' file |
[a-z] |
匹配字符范围 | grep '[A-Za-z]' file |
\d |
数字字符(需-E 扩展) |
grep -E '\d+' file |
表达式 | 功能 | 示例 |
---|---|---|
() |
捕获分组 | grep -E '(ab)+' file |
\ |
转义特殊字符 | grep '\.com' file |
| |
逻辑或(需-E 扩展) |
grep -E 'cat|dog' file |
# 贪婪匹配(匹配最长内容)
grep -P '<.*>' file
# 非贪婪匹配(匹配最短内容)
grep -P '<.*?>' file
# 捕获重复出现的模式
grep -P '(\w+)\s+\1' file # 匹配连续重复的单词(如"the the")
grep -E '(?:abc|def)' file # 仅分组不捕获
特性 | 基本正则(BRE) | 扩展正则(ERE) |
---|---|---|
元字符需要转义 | 是(如\+ ) |
否 |
支持+ ? | |
需转义 | 直接支持 |
量词{} |
需转义(如\{3\} ) |
直接支持 |
激活方式 | grep 默认 |
grep -E |
# 匹配合法邮箱地址
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}' emails.txt
# 匹配IPv4地址
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' logfile
# 替换手机号中间四位为****
sed -E 's/(1[3-9][0-9])[0-9]{4}([0-9]{4})/\1****\2/g' contacts.txt
# 提取第二列以http开头的记录
awk '$2 ~ /^http/ {print $1,$3}' data.log
.*
贪婪匹配\d
替代.
)grep --color=auto # 高亮显示匹配结果
nano -ET 4 file # 显示制表符和行尾标识
错误类型 | 错误示例 | 修正方案 |
---|---|---|
未转义特殊字符 | grep '3.14' |
grep '3\.14' |
量词位置错误 | [0-9+] |
[0-9]+ |
锚点使用不当 | Error:^ |
^Error: |
贪婪匹配导致性能问题 | .*@.*\.com |
\w+@\w+\.com |
符号 | 功能描述 |
---|---|
\b |
单词边界 |
\B |
非单词边界 |
\s |
空白字符(需-P 参数) |
\S |
非空白字符 |
\w |
字母/数字/下划线 |
\W |
非单词字符 |
(?i) |
忽略大小写(模式修饰符) |