linux入门学习(介绍、常用命令、vim、shell)

发布于:2025-05-13 ⋅ 阅读:(14) ⋅ 点赞:(0)

文章目录


前言

阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
由于linux内容很多,本文并不能介绍所有知识。仅供参考


Linux介绍

Linux内核版本

内核(kernel)是系统的心脏,是运行程序和管理磁盘等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。

Linux内核版本又分为稳定版和开发版
稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些bug或加入一些新的驱动程序。
开发版:由于要试验各种解决方案,所以变化很快。

内核源码网址:http://www.kernel.org 所有来自全世界的对Linux源码的修改最终都会汇总到这个网站,由Linus领导的开源社区对其进行甄别和修改最终决定是否进入到Linux主线内核源码中。

Linux发行版本

Linux发行版 (也被叫做 GNU/Linux 发行版) 在内核基础上,通常还包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
在这里插入图片描述

Linux的安装(仅作参考)

https://blog.csdn.net/2302_80269895/article/details/143213412

Linux系统启动过程

Linux系统的启动过程可以分为5个阶段:

  • 内核的引导。
  • 运行 init。
  • 系统初始化。
  • 建立终端 。
  • 用户登录系统。

加载内核

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
在这里插入图片描述

启动初始化进程init

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

init程序首先是需要读取配置文件/etc/inittab。
在这里插入图片描述

确定运行级别

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
在这里插入图片描述

加载开机启动程序

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
在这里插入图片描述

用户登录

一般来说,用户的登录方式有三种:

  • (1)命令行登录
  • (2)ssh登录
  • (3)图形界面登录

在这里插入图片描述

Linux文件目录

在这里插入图片描述

  • /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
  • /bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
  • /boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
  • /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
  • /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录,edu 表示用户 edu 的家目录。
  • /lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
  • /mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
  • /opt:给主机额外安装软件所摆放的目录。
  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
  • /root:系统管理员root的家目录。
  • /sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能"查看"而不能设置和使用。
  • /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
  • /srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
  • /usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
  • /var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。

从/目录开始描述的路径为绝对路径
从当前位置开始描述的路径为相对路径,如:

cd ../../
ls abc/def

每个目录下都有**...**
. 表示当前目录
.. 表示上一级目录,即父目录
根目录下的.和…都表示当前目录

文件类型

文件的颜色 含义
蓝色 目录
绿色 可执行文件
红色 压缩文件
浅蓝色 链接文件
灰色 其他文件

Linux终端命令行格式

linux系统,如果是安装了有图形化界面的版本,可以和windows系统一样,通过图形化的操作实现部分操作。
但主要还是通过终端命令行的方式与Linux系统进行交互。
因此,我们需要学习linux终端命令行。

格式:

command [-options] [parameter]

说明:

  • command :命令名,相应功能的英文单词或单词的缩写
  • [-options] :选项,可用来对命令进行控制,也可以省略
  • parameter :传给命令的参数,可以是 零个、一个 或者 多个

查阅命令帮助信息

命令的选项 和 参数比较多,可以输入
command -help 显示 command 命令的帮助信息
man command 查阅 command 命令的使用手册(man 是 manual 的缩写,是 Linux 提供的一个 手册,包含了绝大部分的命令、函数的详细使用)
当进入查阅 command 命令的使用手册时, 有一些操作键可以帮助我们方便阅读手册。
在这里插入图片描述

tab键自动补全

在敲出命令的前几个字母的同时,按下tab键,系统会自动帮我们补全命令

终端命令行中的常用ctrl组合键

  • Ctrl+c 结束正在运行的程序
  • Ctrl+l 清屏,【是字母L的小写】等同于Clear
  • 当前光标到行首:ctrl+a
  • 当前光标到行尾:ctrl+e
  • Ctrl+x+u 撤销操作
  • ‌复制‌:Ctrl+Shift+C
  • 粘贴‌:Ctrl+Shift+V

Linux终端命令

列出目录的内容:ls

Linux文件或者目录名称最长可以有265个字符,“.”代表当前目录,“…”代表上一级目录,以“.”开头的文件为隐藏文件,需要用 -a 参数才能显示。

ls 目录

ls常用参数:

参数 含义
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-l 以列表方式显示文件的详细信息
-h 配合 -l 以人性化的方式显示文件大小
[root@VM_0_9_centos ~]# ll -h
total 24K
-rw-r--r-- 1 root root 1.6K Dec  1  2016 CentOS7-Base-163.repo.1
-rw-r--r-- 1 root root 6.0K Nov 12  2015 mysql-community-release-el7-5.noarch.rpm
-rw-r--r-- 1 root root   90 Nov 23 10:26 passwd
drwxr-xr-t 2 root root 4.0K Nov 22 21:15 test
-rw-r--r-- 1 root root  276 Nov 24 10:01 user
lrwxrwxrwx 1 root root   14 Nov  6 19:18 web -> /var/www/html/

列出的信息的含义:
在这里插入图片描述
ls支持搭配通配符 查找并显示文件:

通配符 含义
* 代表文件名中所有字符
ls te* 查找以te开头的文件
ls *html 查找结尾为html的文件
代表文件名中任意一个字符
ls ?.c 查找第一个字符任意,后缀为.c的文件
ls a.? 查找前2字符为a.,最后一个字符任意的文件
[] [”和“]”将字符组括起来,表示可以匹配字符组中的任意一个。“-”用于表示字符范围。
[abc] 匹配a、b、c中的任意一个
[a-f] 匹配从a到f范围内的的任意一个字符
ls [a-f]* 查找从a到f范围内的的任意一个字符开头的文件
\ 转义字符
ls *a 查找文件名为*a的文件

显示文件元数据:stat

stat [文件]

# 例 stat file.txt
# 显示内容
  File: file.txt
  Size: 6140            Blocks: 16         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 394398      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-11-23 13:30:42.000000000 +0800
Modify: 2015-11-12 15:58:42.000000000 +0800
Change: 2019-11-23 13:30:42.400300171 +0800
Birth: -
元数据字段 含义
Size 文件大小
Inode 文件唯一标识
Access 文件权限
Access 最后访问时间
Modify 最后内容修改时间
Change 最后元数据变更时间
Birth 创建时间

文件访问权限

用户能够控制一个给定的文件或目录的访问程度,一个文件或目录可能 有读、写及执行权限:

  • 读权限(r) :对于文件,具有读取文件内容的权限;对于目录,具有浏览目录的权限。
  • 写权限(w) :对于文件,具有修改文件内容的权限;对于目录,具有创建、删除、移动目录内文件的权限。
  • 可执行权限(x): 对于文件,具有执行文件的权限;对于目录,该用户具有进入目录的权限。

通常,Unix/Linux系统只允许文件的属主(所有者)或超级用户改变文件的读写权限。

在这里插入图片描述
第1个字母代表文件的类型:

  • “d” 代表文件夹
  • “-” 代表普通文件
  • “c” 代表硬件字符设备
  • “b” 代表硬件块设备
  • “s”表示管道文件
  • “l” 代表软链接文件。

后9个字母分别代表三组权限:文件所有者、用户组、其他用户拥有的权限。

修改文件权限:chmod

chmod 修改文件权限有两种使用格式:字母法与数字法。

字母法:chmod u/g/o/a +/-/= rwx 文件
[ u/g/o/a ] 含义
u user 表示该文件的所有者
g group 表示与该文件的所有者属于同一组( group )者,即用户组
o other 表示其他以外的人
a all 表示这三者皆是
[ ±= ] 含义
+ 增加权限
- 撤销权限
= 设定权限
rwx 含义
r read 表示可读取
w write 表示可写入
x excute 表示可执行

数字法:将rwx的权限利用 数字之和代替

rwx 说明
r 读取权限,数字代号为 “4”
w 写入权限,数字代号为 “2”
x 执行权限,数字代号为 “1”
- 不具任何权限,数字代号为 “0”

如执行:chmod u=rwx,g=rx,o=r filename
就等同于:chmod u=7,g=5,o=4 filename

文件所有者:读、写、执行权限
同组用户:读、执行的权限
其它用户:读的权限

文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示(逆向显示)
  • nl 显示的时候,顺道输出行号
  • more 一页一页的显示文件内容,不支持向前翻页等功能
  • less 一页一页的显示文件内容 支持多项功能
  • head 只看头几行
  • tail 只看尾巴几行

基本显示:cat、tac

cat [-AbEnTv] filename

选项:

-A :相当于 -vET 的整合选项,列出特殊字符;
-v :列出一些看不出来的特殊字符
-E :将结尾的断行字节 $ 显示出来;
-T :将 [tab] 按键以 ^I 显示出来;
-b :列出行号,空白行不标行号
-n :列出行号,连同空白行也会有行号

显示行号:nl

nl [-bnw] 文件

选项与参数:

-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在荧幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w :行号栏位的占用的位数。

分屏显示:more、less

more运行后可以输入的命令有:
空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :输入要查找的字符串(仅支持向前查找)。;
q :代表立刻离开 more ,不再显示该文件内容。
显示行号:按 =

less运行后可以输入的命令有:
空白键 :向下翻动一页;
b :向上翻动一页;
Enter :向下翻动一行;
k :向上翻动一行;
/字串 :向前搜寻『字串』的功能;
?字串 :向后搜寻『字串』的功能;
q :离开 less 这个程序;
显示行号:按 =

取首尾n行:head、tail

head [-n number] 文件 

选项与参数:
-n :后面接数字,代表显示几行的意思。没有选项与参数,默认显示前面的 10 行。

tail [-n number] 文件 

选项与参数:
-n :后面接数字,代表显示几行的意思。没有选项与参数,默认显示最后的 10 行。

文件管理

输出重定向:>

可将本应显示在终端上的内容保存到指定文件中。

如:ls > test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 )

注意: >输出重定向会覆盖原来的内容,>>输出重定向则会追加到文件的尾部。

管道:|

管道:一个命令的输出可以通过管道 做为另一个命令的输入。
“ | ”的左右分为两端,从左端写入到右端。

清屏:clear

clear作用为清除终端上的显示

切换工作目录: cd

提醒:Linux所有的目录和文件名大小写敏感
cd后面可跟绝对路径,也可以跟相对路径。如果省略目录,则默认切换到当前用户的主目录。

命令 含义
cd 相当于cd ~
cd ~ 切换到当前用户的主目录(/home/用户目录)
cd . 切换到当前目录
cd … 切换到上级目录
cd - 进入上次所在的目录

显示当前路径:pwd

python@ubuntu:~$ pwd 
/home/python

创建目录:mkdir

注意:新建目录的名称不能与当前目录中已有的目录或文件同名,并且目录创建者必须对当前目录具有写权限。

mkdir [-mp] 目录名称

选项与参数:
-m :指定被创建目录的权限,而不是根据默认权限 (umask) 设定
-p :递归创建所需要的目录

实例:-p递归创建目录:

[root@www ~]# cd /tmp
[root@www tmp]# mkdir test    <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4': 
No such file or directory       <== 没办法直接创建此目录
[root@www tmp]# mkdir -p test1/test2/test3/test4

删除文件:rm

可通过rm删除文件或目录。使用rm命令要小心,因为文件删除后不能恢复。为了防止文件误删,可以在rm后使用-i参数以逐个确认要删除的文件。

常用参数及含义如下表所示:

参数 含义
-i 以进行交互式方式执行
-f 强制删除,忽略不存在的文件,无需提示
-r 递归地删除目录下的内容,删除文件夹时必须加此参数

建立链接文件:ln

软链接:ln -s 源文件 链接文件
硬链接:ln 源文件 链接文件

软链接类似于Windows下的快捷方式,如果软链接文件和源文件不在同一个目录,源文件要使用绝对路径,不能使用相对路径。

硬链接只能链接普通文件不能链接目录。 两个文件占用相同大小的硬盘空间,即使删除了源文件,链接文件还是存在。

touch:创建空文件

语法:touch [OPTION]… FILE…
touch命令用于创建一个或多个空文件。
touch test.txt会在当前目录下创建一个名为test.txt的空文件。

查找文件:find

find 命令通常用来在特定的目录下搜索符合条件的文件
find命令会从指定目录向下递归遍历各个子目录,从而找到满足条件的文件或目录。
语法:find [指定查找目录]… [OPTION]
OPTION常用可选值有以下几种,可以自由组合:

-name:按照名称查找,支持通配符。
-user:使用用户名查找。
-size :按照文件大小查找,+号表示大于,-号表示小于。
-perm:指定文件的权限。
-type :指定文件的类型,d为目录。

示例:
find -name test.txt:在当前目录下查找test.txt。
find / -name ‘*.txt’:从根目录下递归查找以.txt结尾的文件。
find -type d:查找当前目录下的所有目录。
find -size +100M/-100M:查找当前目录下大于100M/小于100M的文件。

文本搜索grep

grep命令是一种强大的文本搜索工具。
语法:grep [OPTION]… PATTERN [FILE]…
常用选项示例:
-n:显示行号。
-i:忽略大小写。

示例:cat 文件 | grep ‘搜索的字符’ 将文件中的内容使用grep进行搜索,|为管道符,可以将前一个命令的处理结果输出传递到后面的命令处理。
在这里插入图片描述

拷贝文件:cp

cp命令的功能是将给出的文件或目录复制到另一个文件或目录中
cp [OPTION]… SOURCE… DIRECTORY
递归复制目录需要使用-r选项。

移动文件:mv

语法:mv [OPTION]… SOURCE… DIRECTORY
mv命令有两个主要用途:一是重命名文件或目录,二是将文件或目录从一个位置移动到另一个位置。
重命名写法:mv old_filename new_filename

归档管理:tar

此命令可以把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据。

tar [参数] 打包文件名 文件

常用参数:

参数 含义
-c 生成档案文件,创建打包文件
-v 列出归档解档的详细过程,显示进度
-f 指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后
-t 列出档案中包含的文件
-x 解开档案文件

文件的打包与解开示例

python@ubuntu:~/test$ tar -cvf test.tar 1.txt 2.txt 3.txt 
1.txt
2.txt
3.txt
python@ubuntu:~/test$ ll
总用量 32
drwxrwxr-x  2 python python  4096 1121 14:02 ./
drwxr-xr-x 31 python python  4096 1121 13:34 ../
-rw-rw-r--  1 python python    51 120  2017 1.txt
-rw-rw-r--  1 python python    55 120  2017 2.txt
-rw-rw-r--  1 python python    51 120  2017 3.txt
-rw-rw-r--  1 python python 10240 1121 14:02 test.tar
python@ubuntu:~/test$ rm -rf *.txt
python@ubuntu:~/test$ ll
总用量 20
drwxrwxr-x  2 python python  4096 1121 14:03 ./
drwxr-xr-x 31 python python  4096 1121 13:34 ../
-rw-rw-r--  1 python python 10240 1121 14:02 test.tar
python@ubuntu:~/test$ tar -xvf test.tar 
1.txt
2.txt
3.txt
python@ubuntu:~/test$ ls *.txt
1.txt  2.txt  3.txt

文件压缩解压:gzip

tar与gzip命令结合使用实现文件打包、压缩。 tar只负责打包文件,但不压缩,用gzip压缩tar打包后的文件,其扩展名一般用xxxx.tar.gz。

gzip  [选项]  文件
选项 含义
-d 解压文件
-r 压缩文件
python@ubuntu:~/test$ ll *.tar*
-rw-rw-r-- 1 python python 10240 1125 07:39 test.tar
python@ubuntu:~/test$ gzip -r test.tar test.tar.gz  ==>或者:gzip test.tar
python@ubuntu:~/test$ ll *.tar*
-rw-rw-r-- 1 python python 139 1125 07:39 test.tar.gz
python@ubuntu:~/test$ gzip -d test.tar.gz
python@ubuntu:~/test$ ll *.tar*  
-rw-rw-r-- 1 python python 10240 1125 07:39 test.tar

tar命令中-z选项可以调用gzip实现了一个压缩的功能,实行一个先打包后压缩的过程。

tar zcvf 压缩包包名 文件1 文件2

例如: tar zcvf test.tar.gz 1.c 2.c 3.c 4.c把 1.c 2.c 3.c 4.c 先打包后压缩成 test.tar.gz

python@ubuntu:~/test/code$ ls
1.c  2.c  3.c  4.c
python@ubuntu:~/test/code$ tar zcvf test.tar.gz 1.c 2.c 3.c 4.c 
python@ubuntu:~/test/code$ ls
1.c  2.c  3.c  4.c  test.tar.gz
tar zxvf 压缩包包名 #先解压再解包

.tar.gz 先解压后解包 到指定目录:-C (解压时可以不指定-z选项)

python@ubuntu:~/test/code$ ls number/     
python@ubuntu:~/test/code$ tar xvf test.tar.gz -C number/     
python@ubuntu:~/test/code$ ls number/                    
1.c  2.c  3.c  4.c

文件压缩解压:zip、unzip

通过zip压缩文件的目标文件不需要指定扩展名,默认扩展名为zip。

压缩文件:zip [-r] 目标文件 源文件
解压文件:unzip [-d 解压到指定目录] 压缩文件

系统管理

查看当前日历:cal

cal命令用于查看当前日历,-y显示整年日历:

python@ubuntu:~$ cal
      十一月 2019        
日 一 二 三 四 五 六  
                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 

显示或设置时间:date

设置时间格式(需要管理员权限):

# 查看当前时间 date
# 自定义格式输出时间
date +format
# 例如
date +"今天是:%Y年%m月%d日 %H:%M:%S"
format格式 含义
%Y,%y
%m
%d
%H
%M
%S

查看网络状态:netstat

netstat命令用于显示网络状态。

利用netstat指令可让你得知整个Linux系统的网络情况。

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

参数说明:

  • -a 显示所有连线中的Socket。
  • -A<网络类型> 列出该网络类型连线中的相关地址。
  • -c 持续列出网络状态。
  • -C 显示路由器配置的快取信息。
  • -e 显示网络其他相关信息。
  • -F显示FIB。
  • -g 显示多重广播功能群组组员名单。
  • -h 在线帮助。
  • -i 显示网络界面信息表单。
  • -l 显示监控中的服务器的Socket。
  • -M 显示伪装的网络连线。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -N 显示网络硬件外围设备的符号连接名称。
  • -o 显示计时器。
  • -p 显示正在使用Socket的程序识别码和程序名称。
  • -r 显示Routing Table。
  • -s 显示网络工作信息统计表。
  • -t 显示TCP传输协议的连线状况。
  • -u 显示UDP传输协议的连线状况。
  • -v 显示指令执行过程。
  • -V显示版本信息。
  • -w 显示RAW传输协议的连线状况。
  • -x 此参数的效果和指定"-A unix"参数相同。
  • –ip 此参数的效果和指定"-A inet"参数相同。

常用:

[root@VM_0_9_centos ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0    0.0.0.0:22    0.0.0.0:*      LISTEN   3308/sshd
tcp6       0      0         :::80         :::*      LISTEN   4624/httpd

查看进程信息:ps

ps [options]

ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路 径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。

动态显示进程:top

top命令用来动态显示运行中的进程。top命令能够在运行后,在指定的时间间隔更新显示信息。-d参数可以指定显示信息更新的时间间隔。

在top命令执行后,可以按下按键得到对显示的结果进行排序:

按键 含义
M 根据内存使用量来排序
P 根据CPU占有率来排序
T 根据进程运行时间的长短来排序
U 可以根据后面输入的用户名来筛选进程
K 可以根据后面输入的PID来杀死进程。
q 退出
h 获得帮助
python@ubuntu:~$ top
top - 08:31:54 up 2 min,  1 user,  load average: 0.25, 0.37, 0.17
Tasks: 271 total,   1 running, 270 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4028880 total,  3210104 free,   331668 used,   487108 buff/cache
KiB Swap:  4192252 total,  4192252 free,        0 used.  3414856 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    
  4827 redis     20   0   47204   6632   2300 S   0.3  0.2   0:00.21 redis-ser+ 
  6371 python    20   0   49000   3896   3176 R   0.3  0.1   0:00.12 top        
     1 root      20   0  119940   6112   4004 S   0.0  0.2   0:02.77 systemd    
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd   
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.11 ksoftirqd+ 

输出字段说明:

pid:进程ID
ppid:父进程ID
user:进程所有者
%cpu:CPU占用百分比
%mem:内存占用百分比
rss:物理内存占用(KB)
vsz:虚拟内存占用(KB)
stat:进程状态(如S=休眠,R=运行)
cmd:完整命令行

终止进程:kill

kill命令指定进程号的进程,配合 ps/top 使用。

使用格式:

kill [-signal] pid

信号值从0到15,其中9为绝对终止,可以处理一般信号无法终止的进程。

关机重启:reboot、shutdown、init

命令 含义
reboot 重新启动操作系统
shutdown –r now 重新启动操作系统,shutdown会给别的用户提示
shutdown -h now 立刻关机
shutdown -h 20:25 系统在今天的20:25 会关机
shutdown -h +10 系统再过十分钟后自动关机
init 0 关机
init 6 重启

检测磁盘空间:df

df命令用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况。

选项 含义
-a 显示所有文件系统的磁盘使用情况
-m 以1024字节为单位显示
-t 显示各指定文件系统的磁盘空间使用情况
-T 显示文件系统
python@ubuntu:~/test$ df -Th
文件系统       类型      容量  已用  可用 已用% 挂载点
udev           devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs          tmpfs     394M  6.4M  388M    2% /run
/dev/sda1      ext4       21G  8.7G   11G   45% /
tmpfs          tmpfs     2.0G  256K  2.0G    1% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M    1% /run/lock
tmpfs          tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
tmpfs          tmpfs     394M   44K  394M    1% /run/user/1000
[root@VM_0_9_centos ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       50G  4.8G   42G  11% /
devtmpfs       devtmpfs  909M     0  909M   0% /dev
tmpfs          tmpfs     920M   24K  920M   1% /dev/shm
tmpfs          tmpfs     920M  472K  919M   1% /run
tmpfs          tmpfs     920M     0  920M   0% /sys/fs/cgroup
tmpfs          tmpfs     184M     0  184M   0% /run/user/0

检测目录所占磁盘空间:du

du命令用于统计目录或文件所占磁盘空间的大小,该命令的执行结果与df类似,du更侧重于磁盘的使用状况。

du [选项] 目录或文件名
选项 含义
-a 递归显示指定目录中各文件和子目录中文件占用的数据块
-s 显示指定文件或目录占用的数据块
-b 以字节为单位显示磁盘占用情况

查看或配置网卡信息:ifconfig

查看网卡信息。通过该命令可以获取网卡的IP地址、子网掩码、MAC地址等信息,帮助我们了解网络接口的配置情况。

测试远程主机连通性:ping

ping ip地址/域名
测试与某台主机的连通性。例如,ping www.baidu.com 可以测试当前主机与百度服务器之间的网络连接是否正常。

vim

什么是 vim?

Vim是从 vi 发展出来的一个文本编辑器。拥有代码补完、编译及错误跳转等方便编程的功能,在程序员中被广泛使用。vim 的官方网站 (http://www.vim.org)

为什么要学习vim?

vim是Linux上的文本编辑器(写代码的工具),有时候在我们的生产环境下我们的软件可能会出现各种各样的问题,这些问题都需要我们通过vim来解决

这里是一张vim的指令的键盘图
在这里插入图片描述
在我们使用的Linux操作系统上一般都会默认安装vim,不需要我们再次安装。我们可以直接输入vim回车查看是否安装,若显示效果如下则表示以安装。(使用ctrl + z返回)
在这里插入图片描述
若没有vim可使用下面的指令安装

yum install -y vim         //root下
sudo yum install -y vim    //普通用户下,使用sudo安装

使用vim打开文件

vim 文件名(我们可以直接使用vim 文件名打开文件编译,该文件不存在默认创建文件,该文件存在打开该文件)
在使用上述命令打开文件后,就进入vim全屏幕编辑画面:
用vim打开文件之后,默认处于[命令模式],随后对vim这三种工作模式进行介绍。

在这里插入图片描述

工作模式

vim可以分为三种状态:

  • 命令模式(command mode)
  • 插入模式(Insert mode)
  • 底行模式(last line mode)

在这里插入图片描述

命令模式

用户刚刚启动 vim,便进入了命令模式。 任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式。此状态下敲击键盘动作会被Vim识别为命令。

在命令行模式下我们可以控制屏幕光标的移动,字符、字或行的删除,移动复制某区段、工作模式切换。

命令模式命令集:

1.切换到插入模式

  • 按【i】切换进入插入模式【insert mode】,按”i“进入插入模式后是从光标当前位置开始输入文件;
  • 按【a】进入插入模式后,是从目前光标所在位置的下一个位置开始插入文字;
  • 按【o】进入插入模式后,是插入新的一行,从行首开始输入文字。
  • 按【ESC】键从插入模式退回命令模式

2.光标移动

  • vim可以直接用光标来上下左右移动,但规定的vim是用小写英文字母 【h】、【j】、【k】、【l】,分别控制光标左、下、上、右移一格。
  • 按 【G】:移动到文章的最后
  • 按 【$】:移动到光标所在行的”行尾“
  • 按 【^】:移动到光标所在行的”行首“
  • 按 【w】:光标跳到下个字的开头
  • 按 【n + w】:光标跳到往后第n个字的开头
  • 按 【e】:光标跳到下个字的字尾
  • 按 【b】:光标回到上个字的开头
  • 按 【n + b】:光标跳到往前第n个字的开头
  • 按 【#】:光标移动到该行的第#个位置,如:51,561
  • 按 【gg】:进入到文本开始
  • 按 【shift + g】:进入文本末端
  • 按 【n + shift + g】:首先输入需要定位的行数n,在按shift + g贯标移至该行
  • ctrl+b:上移一页。
  • ctrl+f:下移一页。
  • ctrl+u:上移半页。
  • ctrl+d:下移半页。

3.删除文字

  • 【x】:每按一次,删除光标所在位置的一个字符
  • 【#x】:例如,【6x】表示删除光标所在位置的”后面(包括自己在内)“6个字符
  • 【X】:大写的X,每按一次,删除光标所在位置的”前面“一个字符
  • 【#X】:例如,【20X】表示删除光标所在位置的”前面“20个字符
  • 【dd】:剪切所在行(在使用p进行粘贴,不使用p操作即为删除)
  • 【#dd】:从光标所在行开始剪切#行

4.复制

  • 【yw】:将光标所在之处到字尾的字符复制到缓冲区中。
  • 【#yw】:复制#个字到缓冲区
  • 【yy】:复制光标所在行到缓冲区
  • 【#yy】:例如,【6yy】表示拷贝从光标所在行“往下数”6行文字
  • 【p】:将缓冲区内的字符贴到光标所位置。注意:所有与”y“有关的复制命令都必须与”p“配合才能完成复制与粘贴功能。

5.替换

  • 【r】:替换光标所在处的字符
  • 【R】:替换光标所到之处的字符,直到按下【ESC】键为止

6.撤销上一次操作

  • 【u】:如果您误执行一个命令,可以马上按下【u】,回到上一个操作。按多次”u“可以执行多次回复
  • 【ctrl + r】:撤销的恢复

7.更改

  • 【cw】:更改光标所在处的字到字尾处
  • 【c#w】:例如,【c3w】表示更改3个字
  • 【shift + ~】:进行大小写切换
  • 【r】+【替换的字符】:先按r后在按需要替换的字符,光标所指字符就替换为要替换的字符了
  • 【n+r】+【替换的字符】:增加n表示替换光标所在位置后的n个字符。
  • 【shift + r】:进入替换模式(使用【ESC】退出该模式)进入替换模式后,vi 画面的左下角处会出现『–REPLACE–』的字样

8.跳至指定的行

  • 【ctrl】+【g】列出光标所在行的行号。
  • 【#G】:例如,【15G】,表示移动光标至文章的第15行行首。

输入模式

在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键ESC即可。
在这里插入图片描述

底行模式

在命令模式下按下:(英文冒号)就进入了底行模式。
底线模式可以输入单个或多个字符的命令,可用的命令非常多(如下所示)。

:set nu 列出行号
:set nonu	取消行号
:#7 跳到文件中的第7/keyword 查找字符  按n向下
?keyword 查找字符  按N向下
:n1,n2/word1/word2/gc  替换指定范围单词,c表示提示
:w 保存文件
:w filename 以指定的文件名另存
:n1,n2 w [filename]	将 n1 到 n2行另存
:r [filename]	读入另一个文件加到光标所在行后面
:! ls /home  在vi当中察看ls输出信息!
:q离开vi
:wq 和 :ZZ 和 :x 保存并退出vi
!强制执行
:% s/^/#/g 来在全部内容的行首添加 # 号注释
:1,10 s/^/#/g 在1~10 行首添加 # 号注释  

按ESC键可随时退出底线模式,回到命令模式。

常用操作:

命令 说明
:w 保存编辑数据
:q 离开 vi
:q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件。
:wq 保存并离开vim
ZZ 若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:w [filename] 另存为
:r [filename] 将另一个文件『filename』的数据加到光标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 行的内容储存成 filename 这个文件。
:set nu 会在每一行的前缀显示该行的行号
:set nonu 取消行号显示

Shell编程

介绍

这里说的Shell 脚本(shell script),是在Linux 环境下运行的脚本程序。Shell 脚本是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器(前文已介绍了vim)和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……

Bash(Bourne Again Shell)是大多数Linux 系统默认的 Shell,在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell。
查看自己linux系统的默认解析:echo $SHELL
在这里插入图片描述

shell脚本命名

  • shell脚本命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾
  • 不能使用特殊符号、空格
  • 见名知意,名称要写的一眼可以看出功能

shell语法

第一个hello world

# 创建一个Helloword.sh 文件
[root@aly_server01~] touch Helloword.sh

# 使用vim编辑Helloword.sh 文件
[root@aly_server01~] vim Helloword.sh

# 以下两行为脚本内容
#!/bin/bash
echo "hello world"

[root@aly_server01~]# ll Helloword.sh 
-rw-r--r-- 1 root root 85 Sep 20 22:26 Helloword.sh

# 赋予执行权限
[root@aly_server01~]# chmod o+x Helloword.sh 

# 运行helloword.sh 脚本
[root@aly_server01~]# ./Helloword.sh 
hello world

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
运行 Shell 脚本,默认情况下,一定要写成 ./Helloword.sh,而不是 Helloword.sh,运行其它二进制的程序也一样。
如果不加./的话, 会默认去找PATH环境变量中是否存在该脚本 并执行。除非将当前目录.加入到PATH环境变量中

另外一种执行方式:bash ./xxx.sh 指明先用bash解析器解析,如果bash不存在 才会使用默认解析器

单行注释

单个"#"号代表注释当前行
在这里插入图片描述

变量

定义变量

格式 :变量名=变量值
如:num=10

变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

加花括号可以帮助解释器识别变量的边界,比如:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

python@ubuntu:~/shell$ myUrl="http://www.google.com"
python@ubuntu:~/shell$ readonly myUrl
python@ubuntu:~/shell$ myUrl="http://www.baidu.com"
-bash: myUrl: 只读变量

删除变量

使用 unset 命令可以删除变量,但不能删除只读变量:

#!/bin/sh
myUrl="http://www.baidu.com"
unset myUrl
echo $myUrl

从键盘获取值read

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

案例一

在这里插入图片描述

在这里插入图片描述

案例二

在一行上显示和添加提示 需要加上-p
在这里插入图片描述
在这里插入图片描述

案例三:读取多个值

在这里插入图片描述
在这里插入图片描述

变量类型

系统变量
# Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:

$0 		当前脚本的名称;
$n 		当前脚本的第n个参数,n=1,2,9;
$* 		当前脚本的所有参数(不包括程序本身);
$# 		当前脚本的参数个数(不包括程序本身);
$? 		程序执行完后返回的状态,返回0表示执行成功;
$$ 		程序本身的PID号。

在这里插入图片描述
在这里插入图片描述

常见系统环境变量

系统环境变量是系统提供的共享变量.是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用

PATH  		命令所示路径,以冒号为分割;
HOME  		打印用户家目录;
SHELL 		显示当前Shell类型;
USER  		打印当前用户名;
ID    		打印当前用户id信息;
PWD   		显示当前所在路径;
TERM  		打印当前终端类型;
HOSTNAME    显示当前主机名;
PS1         定义主机命令提示符的;
HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM      随机生成一个 032767 的整数;
HOSTNAME    主机名

系统环境变量输出演示
在这里插入图片描述

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

Shell 函数

shell中函数的定义格式如下:

[ function ] funname[()]
{
    action;
    [return int;]
}

案例一:

#!/bin/bash

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

输出结果:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 12 !
输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

案例二:带参数的函数

#!/bin/bash

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

当n>=10时,需要使用${n}来获取参数。对于这些特殊字符 可参考上文的系统变量这一小节

文件包含(调用其他文件)

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

实例

创建两个 shell 脚本文件。
test1.sh 代码如下:

#!/bin/bash

url="http://www.baidu.com"

test2.sh 代码如下:

#!/bin/bash

#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh

echo "url地址:$url"

接下来,我们为 test2.sh 添加可执行权限并执行:

$ chmod +x test2.sh 
$ ./test2.sh 
url地址:http://www.baidu.com

**注:**被包含的文件 test1.sh 不需要可执行权限。

shell数据类型

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号:

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号:

your_name='taobao'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
# 输出结果为:
Hello, I know you are "taobao"! 

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串:

your_name="taobao"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, taobao ! hello, taobao !
hello, taobao ! hello, ${your_name} !

在这里插入图片描述

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

或单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组元素值
valuen=${array_name[n]}

例子:

#!/bin/bash

my_array=(A B C D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

使用 @或* 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

例子:

#!/bin/bash

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D
获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 expr $a + $b 结果为 30
- 减法 expr $a - $b 结果为 -10
* 乘法 expr $a * $b 结果为 200
/ 除法 expr $b / $a 结果为 2
% 取余 expr $b % $a 结果为 0
= 赋值 a=$b 将把变量 b 的值赋给 a
== 相等 用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false
!= 不相等 用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true

注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
完整的表达式要被 ` 包含,这个字符是反引号在 Esc 键下边。

算术运算符实例如下:

#!/bin/bash

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ]返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
#!/bin/bash

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

执行脚本,输出结果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算 表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算 有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算 两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#!/bin/bash

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

执行脚本,输出结果如下所示:

10 != 20 : a 不等于 b
10 小于 10020 大于 15 : 返回 true
10 小于 10020 大于 100 : 返回 true
10 小于 520 大于 100 : 返回 false

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
#!/bin/bash

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

执行脚本,输出结果如下所示:

返回 false
返回 true

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n “$a” ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
#!/bin/bash

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

执行脚本,输出结果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

#!/bin/bash

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

执行脚本,输出结果如下所示:

文件可读
文件可写
文件可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在

test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符串和文件三个方面的测试,搭配基础运算符使用。
test 命令在现代 shell 脚本中通常被 [] 替换,具有相同的功能。两者可以互换使用。

举例一:数值测试(判断是否相等)

test "111" -eq  "111" && echo "相等" || echo "不相等"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ "111" -eq  "111" ] && echo "相等" || echo "不相等"

举例二:字符串比较(判断是否相等)

test "aaa" = "aaa" && echo "字符串相等" || echo "字符串不相等"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ "aaa" = "aaa" ] && echo "字符串相等" || echo "字符串不相等"

举例三: 文件测试(判断是否存在)

test -e /etc/passwd && echo "是文件" || echo "不是文件"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ -e /etc/passwd ] && echo "是文件" || echo "不是文件"

Shell流程控制

if 语句语法格式

if condition
then
    command1 
    command2
    ...
    commandN 
fi

if else 语法格式

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else语法格式

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循环格式

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while循环

while condition
do
    command
done

示例

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按Ctrl-D结束循环。

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

运行脚本,输出类似下面:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:淘宝
是的!淘宝 是一个好网站

死循环语法格式

while :
do
    command
done

或者

while true
do
    command
done

# 或者
for (( ; ; ))

until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until condition
do
    command
done

condition 为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

break命令允许跳出所有循环(终止执行后面的所有循环)。

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

continue命令与break命令类似,它不会跳出所有循环,仅仅跳出当前循环。


参考目录

https://www.bilibili.com/video/BV1vk4y1r7cW
https://blog.csdn.net/weixin_44895651/article/details/105289038
https://blog.csdn.net/lydms/article/details/101368670
https://blog.csdn.net/weixin_45075226/article/details/146059491
https://blog.csdn.net/liuwei0376/article/details/88245472
https://blog.csdn.net/as604049322/article/details/120446586
https://blog.csdn.net/leah126/article/details/131558171
https://blog.csdn.net/qq_41877371/article/details/119569877
https://blog.csdn.net/m0_52094687/article/details/128542024