Linux 基础
一、Linux 概述
简介
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
发行版
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
应用领域
今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。
目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎。
- 巴西联邦政府由于支持 Linux 而世界闻名。
- 有新闻报道俄罗斯军队自己制造的 Linux 发布版的,做为 G.H.ost 项目已经取得成果。
- 印度的 Kerala 联邦计划在向全联邦的高中推广使用 Linux。
- 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用 Linux。
- 在西班牙的一些地区开发了自己的 Linux 发布版,并且在政府与教育领域广泛使用,如 Extremadura 地区的 gnuLinEx 和 Andalusia 地区的 Guadalinex。
- 葡萄牙同样使用自己的 Linux 发布版 Caixa Mágica,用于 Magalh?es 笔记本电脑和 e-escola 政府软件。
- 法国和德国同样开始逐步采用 Linux。
Linux 系统结构
Linux 系统结构分为内核、Shell、应用程序三个层次
- 内核层
Linux 系统的核心部分,负责系统中硬件设备管理、文件系统、内存管理和进程管理等核心任务。Linux 内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,使得内核可以兼容各种硬件设备和外围设备。 - Shell 层
Shell 是 Linux 系统的命令行解释器,负责将用户输入的命令解释并执行。最常用的是 Bash Shell,Bash Shell 提供了丰富的功能,例如通配符、重定向、管道、变量等。 - 应用层
Linux 系统的各种应用程序和服务,包括文本编辑器、图形界面、Web 服务器、邮件服务器、数据库服务器等。
系统结构图:
二、环境搭建
本地
环境:
- 虚拟机:VMware Workstation 17
- Linux:CentOS 7
下载地址:
VMware 创建一个虚拟机,配置如下:
设置 CentOS 的路径
开启虚拟机测试,出现以下界面就成功了,然后 install 即可。
远程
Xshell
Xshell 是一款强大的 SSH、TELNET 和 RLOGIN终端仿真软件,适用于 Windows 用户安全地访问 UNIX/Linux 主机。
安装 Xshell 7之后,就可以访问我们的 Linux 主机了。
新建会话,配置如下:
配置主机 ip(在 linux 终端中执行
ifconfig
命令可以查看)
名称随意,主机必须对应。配置用户(与 linux 中用户对应)
密码可以先不填,之后连接时会提示输入密码。
Xftp
Xftp是一个功能强大的 SFTP、FTP 文件传输软件。 使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。
新建会话与 Xshell 类似:
三、磁盘管理
Linux 中,使用一个文档树来组织所有资源,根目录以一个斜杠 / 表示(与 Windows 中 C 盘、D 盘…的结构不一样)。
pwd
:查看当前所在位置
clean
:清屏
ls
:列出子文件(list)
无参,只显示名字
-a,显示当前位置下的所有子文件或子目录以及隐藏子文件或子目录(linux 下,所有以点
.
开头的都是隐藏的)-l,列出更详细的信息
第一列:d 表示目录,减号
-
表示文件。第二列:例如 rwxr-xr-x,文件权限描述信息。
第三列:数字,表示当前目录下有几个直接的子目录。
第四列:例如 root,目录或文件的拥有者。
第五列:例如 root,组的名字,表示属于哪个组。
第七列:例如 3月 18 15:52,最后修改时间。
第八列:例如 公共,文件名。
1
2
3
4
5
6
7
8
9
10
11-rw-------. 1 root root 1726 3月 18 14:30 anaconda-ks.cfg
-rw-r--r--. 1 root root 1774 3月 18 14:31 initial-setup-ks.cfg
-rw-r--r--. 1 root root 6 3月 18 18:15 test.txt
drwxr-xr-x. 2 root root 4096 3月 18 15:52 公共
drwxr-xr-x. 2 root root 4096 3月 18 15:52 模板
drwxr-xr-x. 2 root root 4096 3月 18 15:52 视频
drwxr-xr-x. 2 root root 4096 3月 18 15:52 图片
drwxr-xr-x. 2 root root 4096 3月 18 15:52 文档
drwxr-xr-x. 2 root root 4096 3月 18 15:52 下载
drwxr-xr-x. 2 root root 4096 3月 18 15:52 音乐
drwxr-xr-x. 2 root root 4096 3月 18 15:52 桌面-al,-a 和 -l 的组合
cd
:切换目录(change directory)
cd ..
回到上级目录cd /
回到根目录- 绝对路径以 / 开头,相对路径没有 /
vi 和 vim
什么是 vi?
- vi 是 Linux 操作系统提供的一个编辑器。
- 可以把 vi 看作专门编辑文件的软件。
vi 编辑器的使用:
vi 文件路径
使用 vi 编辑器打开文件。- 输入 i 命令(Insert),切换到编辑模式。
- vi 编辑器为用户准备了两种模式:命令行模式和编辑模式
- 使用 vi 刚打开文件时,编辑器处于命令行模式
- 按下 esc 切换回命令行模式。
- 命令模式下,使用
:wq
命令保存并退出。
什么是 vim?
- vim 是 vi 的升级版
- vim 更适合 coding
编辑命令:
i
:插入:wq
:保存:q!
:强行退出不保存dd
:删除光标所在行yy
:复制光标所在行到缓冲区p
:粘贴缓冲区中的内容gg
:光标移动到文件第一行GG
:光标移动到文件最后一行^
:光标移动到行首$
:光标移动到行尾/
:查找关键字,n 键下一个o
:在下一行插入x
:删除单个字符
四、文件管理
文件管理就是对文件或目录的新建、删除、复制、移动。
新建命令
新建文件:touch 文件名
,多个文件用空格分隔。
新建目录:mkdir 目录名
,多级目录加 -p 参数
补充:man 命令和 –help 参数
man 和 help 都可以查看某个命令的帮助信息,使用如下:
1 | man <command> |
区别:
- man 的信息更全面,–help 的信息更简洁。
- 使用 man 会进入 man page(空格下一页,q 退出),使用 –help 信息直接打印到控制台。
删除命令
删除文件:
rm 文件名
,多个用空格分隔。这种方式会询问,y 确认删除,n 取消删除。rm -f 文件名
,强行删除,不询问。
删除目录:
rm -r 目录名
,删除目录时,必须加 -r 参数,表示删除一个目录,或递归删除目录下的所有子目录以及子文件。rm -rf 目录名
,强行删除,不询问。
复制命令
复制文件:cp 复制的文件 粘贴的路径
复制目录:cp -rf 复制的目录 粘贴的路径
移动命令
移动文件:mv 移动的文件 移动的位置
我们还可以使用这个命令重命名文件,即:mv 源文件 重命名文件
查看文件内容
常用命令:
- cat 和 tac
- more 和 less
- head 和 tail
- nl
- tailf
文件的 inode
Linux 中,使用 inode 号(index node)来区分文件,也就是文件的唯一标识。
查看文件的 inode 号:ls -i
文件压缩
使用 tar 参数 要压缩的或解压缩的文件或目录
命令,完成压缩和解压缩,在 Linux 中,压缩后的文件叫做归档文件。
常用参数:
- c:创建压缩
- x:解压
- t:查看压缩文件
- z:指定 gzip 压缩方式(速度最快,扩展名通常为 tar.gz)
- j:指定 bzip2 压缩方式(体积最小,扩展名通常为 tar.bz2)
- v:压缩过程中显示文件
- f:指定归档文件名,后边不能有其他参数,一般放在最后
- C:解压到指定目录下
示例:
1 | 压缩 test 目录,归档文件名为 my.tar.gz |
文件权限
概述
为了保证文件安全,Linux 系统引入了文件权限机制。
文件权限包括:rwx
- 读(Read,简称 r)
- 写(Write,简称 w)
- 执行(eXecute,简称 x)
对一个文件来说,有“不同的用户”,包括:UGO
- 文件拥有者(User,简称 U):文件的创建者
- 同组用户(Group,简称 G):和文件创建者同组的用户
- 其他组用户(Other,简称 O):和文件创建者不同组的用户
查看文件权限
之前的 ls -l 命令中就能查看到用户的权限。
例如 rwxr-xr-x:三个字符为一组 rwx r-x r-x,从前往后依次是 UGO 的权限,-
减号表示无权限,U 可以 rwx,G 可以 rx,O 可以 rx。
设置文件权限
有两种方式:基于 UGO 设置和 基于 421 设置
UGO
示例:1
2
3
4
5给同组用户添加写权限
chmod g+w <文件或目录>
撤销同组和其他组用户的读权限
chmod g-r, o-r <文件或目录>421,分别代表 rwx
- 4:读权限
- 2:写权限
- 1:执行权限
- 7 表示有所有权限(4+2+1),6 表示读写权限(4+2),5 表示(4+1)读执行权限,3 表示写执行权限(2+1),0 表示没有任何权限
- 综上所述,共有 0-7 八个数字表示文件权限
示例:
1
2755 等价于 rwxr-xr-x
chmod 755 <文件或目录>
CentOS 文件搜索
CentOS 中,文件搜索有以下方式:
find 命令:在指定目录搜索文件。例如:
1
find /usr/local -name "catalina.out"
grep 命令:在指定文件中搜索字符串。例如:
1
grep "emp" /usr/local/tomcat10/logs/catalina.out
whereis 命令:查找二进制程序、代码等相关文件路径。例如:
1
2[root@localhost01 ~]# whereis pwd
pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz /usr/share/man/man1p/pwd.1p.gzwhich 命令:查找并显示给定命令的绝对路径。例如:
1
2[root@localhost01 ~]# which pwd
/usr/bin/pwd
五、软链接和硬链接
软链接
软链接主要用来快捷地访问文件(也就是 Windows 中的快捷方式)。
软链接和目标文件是两个文件(inode 号不一样),软链接文件中存储的是目标文件的路径。
如果目标文件被删除,软链接就失效了(与 Windows 类似)。
创建软链接:ln -s 目标文件 软链接文件
- 执行 ls 命令查看时,软链接文件为青色,使用
ls -l
可以查看链接的目标文件。 - 我们还可以执行
ls -i
查看 inode,会发现目标文件和软链接文件的 inode 号不一样。
硬链接
硬链接主要用来重要文件备份。
硬链接文件和目标文件的 inode 号一样。
目标文件被删除,硬链接还在。
创建硬链接:ln 目标文件 硬链接文件
(去掉创建软链接中 -s 参数)
- ls 命令查看,硬链接文件不变色。
六、系统命令
data:
查看系统时间
su
:切换用户
ps
:查看系统进程
- ps 常用参数
- -e 查看所有进程
- -f 显示 UID、PPID、C、STIME 栏位信息
kill
:终止进程
- 强行终止
kill -9 进程号
reboot
:重启
shutdown -h now
:关机
七、网络通信命令
ifconfig
:查看 ip 地址(Windows 中的 ipconfig)
ping
:查看计算机之间是否可以正常通信
curl
:模拟用户访问,模拟浏览器行为,例如 curl https://shameyang.vip
(可以直接查看我的博客首页的前端代码)
wget
:下载资源,wget 资源地址
八、管道和重定向
管道
管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。
使用管道符 |
,可以将前边的命令的输出作为后边命令的输入
例如:
1 | ps -ef | grep user |
重定向
>
:输出(将原文件内容清空后,再写入)
>>
:追加的方式输出(原文件内容的末尾追加)
例如:
1 | ifconfig > a.txt |
九、用户管理
Linux 系统中 root 为超级用户(超级管理员),通过 root 可以创建其他普通用户。普通用户只拥有部分权限,防止一些危险操作导致系统崩溃等安全问题。
Linux 中规定,每一个用户都对应:一个用户名 + 一个口令(账号密码)。普通用户使用系统时输入用户名和口令登录,登陆成功就可以进入自己的主目录。
Linux 用户管理主要包括:
- 用户组的管理
- 用户的管理
- 给用户主目录之外的目录授权
用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。
用户组的管理就是对 /etc/group 文件的更新。
使用 root 用户查看当前系统下的用户组:
1
cat /etc/group
查看当前登录的用户属于哪一组:
1
groups
查看某个用户属于哪一组:
1
groups <user>
用户组的添加、修改、删除:
1
2
3
4
5
6
7
8添加
groupadd [选项] 组
修改
groupmod [选项] 组
删除
groupdel [选项] 组
用户管理
添加用户:
默认组名 = 用户名
默认主目录 = /home/用户名
1
2
3
4
5
6
7
8
9
10
11添加用户语法
useradd [选项] <user>
设置密码
passwd <password>
设置用户主目录
useradd -d <主目录> user
设置主目录并指定组和附加组
useradd -d <主目录> -g <组> -G<附加组> user
切换用户:
1 | su <user> |
修改用户:
1 | 修改用户语法 |
删除用户:
1 | 删除用户语法 |
给用户主目录之外的目录授权
给目录授权:
1 | 递归设置权限 |
把目录赋予用户所在组:
1 | chgrp -R <组> <directory> |
给用户添加附加组:
1 | usermod -G <组> <user> |
十、软件的安装和卸载
软件安装方式
在 CentOS 中,安装软件的方式主要包括:
- 源码安装
- rpm 安装(二进制)
- yum 安装(在线)
- dnf(yum 升级版)
源码安装
源码包:源代码文件的一个压缩包,通常为 .tar.gz 或 .tar.bz2。
源码安装通常需要编译器,将源码编译成二进制文件,例如 gcc 编译器
优点:
- 开源,可以修改源代码;利于解读源码
- 可以自由选择功能
- 方便卸载
缺点:
- 安装麻烦,需要解决相关依赖
- 大型软件的编译对新手不友好
rpm 安装
RPM 包(后缀为 .rpm
):Red Hat 开发的包管理系统,方便软件的安装、升级、卸载。CentOS、Redhat、Fedora 等 Linux 发行版都在用这种包管理机制。
DPKG 包(后缀为 .deb
):Debian Linux 开发的包管理机制,主要应用在 Debian 和 Unbuntu 系统中。
优点:
- 包的安装和管理简单
- 安装速度比源码快很多
缺点:
- 二进制文件,看不到源码
- 模块功能定制,用户功能选择不灵活
- 有时需要解决依赖问题
yum 安装
yum 是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载并安装 RPM 包,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
dnf
- DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。
- dnf 与 yum 的区别:
- 语法:dnf 语法更简洁
- 性能:dnf 使用了更高效的算法,处理软件包的性能更好
- 依赖关系处理:dnf 处理软件包依赖关系时更加智能
- 使用的库不同:dnf 使用更加现代化的 libdnf 库,yum 使用比较老的 yum 库
- 插件:dnf 支持更多的插件
yum 安装卸载的相关命令
1 | 安装、升级 |
JDK 的安装和配置(JDK17)
这里以 jdk 17 为例,根据自己系统选择合适的版本
安装 JDK
1 | 1.更新系统 |
注意:如果运行不了 javac 命令,尝试安装 java-11-openjdk-devel.x86_64(这里以 JDK11 为例)
配置环境变量:修改之前先备份!!!
Linux 中路径用冒号 :
,获取 JAVA_HOME 使用美元符号 $
/etc/profile:环境变量配置
1
2
3
4JAVA_HOME=java根路径
CLASSPATH=.:$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH命令行:使环境变量生效
1
source /etc/profile
切换 JDK 版本
1 | alternatives --config java |
查看系统是否安装 JDK
1 | rpm -qa | grep jdk |
Tomcat 的安装和配置(Tomcat10)
这里以 Tomcat10 为例,需要 JDK 版本:JDK 17
安装
第一步:Apache 官网下载 Tomcat 的压缩包 tar.gz 格式的即可
第二步:使用 Xftp 将压缩包上传到 Linux 服务器上,这里选择上传到 /root 目录下
第三步:命令行解压
1
2
3
4
5
6
7
8
9
10
11
12
13
14检查上传是否成功
ls
解压
tar -zxvf apache-tomcat-10.1.19.tar.gz
移动到 /usr/local 下
mv ./apache-tomcat-10.1.19 /usr/local
打开 /usr/local
cd /usr/local
重命名
mv apache-tomcat-10.1.19 tomcat10
配置环境变量
/etc/profile:
1
2
3Tomcat
export CATALINA_HOME=/usr/local/tomcat10
export PATH=$PATH:$CATALINA_HOME/bin使环境变量生效
1
source /etc/profile
测试
1 | 回到工作目录 |
这时访问 8080 端口会因为防火墙打不开,需要我们关闭防火墙或打开 8080 端口并重启防火墙
关闭防火墙
1 | systemctl stop firewalld.service |
打开端口并重启防火墙
1 | 开启端口 |
防火墙的其他命令
systemctl
1 | 开启防火墙服务 |
firewall-cmd
1 | 重启防火墙 |
MySQL 的安装和配置(MySQL 8)
参考文章:CentOS 7 安装 MySQL 8
第一步:卸载 MariaDB(CentOS 7 自带的,会与 MySQL 冲突)
1 | 查看是否安装 MariaDB |
第二步:检查依赖
1 | 查看是否安装 libaio |
第三步:安装 MySQL
官网下载 对应版本压缩包,使用 Xftp 上传到 /usr/local 目录下
1 | cd /usr/local |
第四步:配置 MySQL
1 | 1.创建数据存储目录 |
参数文件 my.cnf:
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
32
33
34
35
36
37
38
39
40
41
42
43
44[client]
port = 3306
socket = /usr/local/mysql/data/mysql.sock
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'
port = 3306
socket = /usr/local/mysql/data/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
datadir = /usr/local/mysql/data
lower_case_table_names=1
如果要设置lower_case_table_names可以在初始化里面设置 ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --lower_case_table_names=1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
第五步:启动
1 | 1.启动 |
最后一步:测试连接
MySQL 服务启停
这里演示的是 CentOS 7 中的命令
1 | 启动 |
十一、JavaWeb 项目部署到生产环境(Linux)
部署
步骤如下:
修改 jdbc 配置的 url
1
2
3
4
5# 之前的
url=jdbc:mysql://localhost:3306/project
# 修改后
url=jdbc:mysql://Linux服务器ip:3306/projectMaven 执行 package 命令,对项目进行打包(打包方式为 war)
将 war 包上传到 Tomcat 根目录的 webapps 目录下
Linux 服务器启动 Tomcat,上传的 war 包会被自动解压
启动成功后,直接访问即可
实时监视
Linux 命令行:进入 Tomcat 根目录下的 logs 目录
1 | 打开日志文件 |
十二、netstat 查看服务及监听端口
实际开发中,netstat 最常用的操作是查看网络连接情况,包括正在监听的接口、建立的连接、连接状态等信息。
常用参数和用法:
查看所有的网络连接状态
1
netstat -a
LISTEN:端口已占用,正在监听,连接未建立,等待连接。
ESTABLISHED:两台机器正在通信中。
TIME_WAIT:连接已终止。
查看所有处于监听状态的连接
1
netstat -l
查看所有 TCP、UDP 连接状态
1
2netstat -t # TCP
netstat -u # UDP查看所有 TIME_WAIT 状态的连接
1
netstat -o
查看指定端口的网络连接状态
1
netstat -an | grep 端口号
十三、Shell 编程
概述
Shell 是一种与操作系统进行交互的命令行解释器。它是一种脚本语言,可以通过编写一些列的命令和脚本来执行操作系统的功能和任务。
Shell 脚本文件后缀为 .sh(Windows 中为 .bat)。
我们在终端编写的命令都是 Shell 命令,例如:ls、grep 等。
Linux 系统中,常见的 Shell 包括:
- Bourne Shell(/bin/sh)
- Bourne-Again Shell(/bin/bash)
- C Shell(/bin/csh)
- TENEX C Shell(/bin/tcsh)
- Korn Shell(/bin/ksh)
- Z Shell(/bin/zsh)
CentOS 中默认 Shell 为 bash,可以使用 chsh
命令更改默认 Shell:
查看已安装的 Shell
1
cat /etc/shells
更改 Shell
1
chsh -s 要更改的Shell路径
检查当前 Shell
1
echo $SHELL
Shell 基础语法
注释
单行注释 #
1 | 这是一行注释 |
多行注释 :''
1 | :' |
变量
我们在 Linux 中使用命令行环境时,Shell 变量非常重要。Shell 变量可以用来存储和操作数据,让我们更加方便地管理文件、程序和系统。
Linux 中,有三种 Shell 变量:
- 环境变量
- 本地变量
- 特殊变量
环境变量
环境变量是系统级别的变量(可以理解为全局变量),在 Shell 会话外配置。之前 /etc/profile 中配置的 JAVA_HOME=xxx、CATALINA_HOME=xxx、PATH=xxx 都是环境变量。
查看当前所有环境变量:
1 | printenv |
或
1 | env |
设置一个新的环境变量:
1 | export MY_VAR="Hello" |
使用环境变量:
1 | echo $MY_VAR |
本地变量
本地变量是一种临时变量(可以理解为局部变量),在 Shell 会话中配置和使用。本地变量仅限于当前 Shell 会话。
设置本地变量:
1 | MY_VAR="Hello" |
使用本地变量:
1 | echo $MY_VAR |
特殊变量
特殊变量是在 Shell 中预定义的变量名称,具有特殊含义。这些变量与当前 Shell 会话有关,有许多用途,例如文件和目录操作、命令历史记录等。
常见的特殊变量:
$0
:当前脚本的文件名$1, $2...
:脚本参数列表中的第几个参数$#
:脚本参数的数量$*
:所有脚本参数的列表$@
:所有脚本参数的列表(字符串)$$
:当前 Shell 的进程 ID$?
:上一个命令的退出状态,一个数值
例如:
1 |
|
控制语句
if 语句
1 | if condition |
for 循环
1 | for var in list |
while 循环
1 | while condition |
until 循环
until 循环条件不成立则一直循环,与 while 相反
1 | until condition |
break 和 continue
控制循环的关键字,与 JAVA 中同理。
Shell 中的中括号 []
Shell 中的中括号有两种使用方式:
注意:① 中括号里最左边和最右边要有一个空格,② 变量用双引号括起来,否则语法错误
- 比较操作符,例如:[ $a -eq $b ]
-eq
:等于-ne
:不等于-lt
:小于-gt
:大于-le
:小于等于-ge
:大于等于
- 测试表达式,例如:[ -f test.txt ]
-f
:文件是否存在并且是一个常规文件-d
:文件是否存在并且是一个目录-z
:字符串是否为空-n
:字符串是否非空-e
:文件或目录是否存在
函数
定义:
1 | function name() { |
输出重定向
Shell 编程中,重定向是一种将输出从一个点重定向到另一个点的方法。
内存 —> 文件
标准输出重定向
在命令中使用 >
以覆盖方式输出重定向到指定文件,例如:
1 | ls > file.txt |
使用 >>
以追加方式,输出重定向到指定文件,例如:
1 | ls >> file.txt |
错误输出重定向
2>
:将错误信息以覆盖方式输出重定向2>>
:将错误信息以追加方式输出重定向
输出复制与分割
使用 |
管道符(之前有提过),将一个命令的输出作为另一个命令的输入。
例如:
1 | ls | grep file |
输入重定向
内存 <— 文件
例如:将 test.txt 文件输入给 sort 命令
1 | sort < test.txt |
数据库自动备份
下面是一个用 Shell 编写的自动备份数据库的脚本:
1 | !/bin/bash |
将脚本保存到一个文件中,例如 backup_db.sh,添加可执行权限:
1 | chmod +x backup_db.sh |
编辑 crontab 文件,可以将脚本设置为定期自动运行,例如每天执行一次:
1 | 编辑 crontab 文件 |