linux入门学习(介绍、常用命令、vim、shell)
文章目录
- 前言
- Linux介绍
- Linux内核版本
- Linux发行版本
- Linux的安装(仅作参考)
- Linux系统启动过程
- 加载内核
- 启动初始化进程init
- 确定运行级别
- 加载开机启动程序
- 用户登录
- Linux文件目录
- 文件类型
- Linux终端命令行格式
- 查阅命令帮助信息
- tab键自动补全
- 终端命令行中的常用ctrl组合键
- Linux终端命令
- 列出目录的内容:ls
- 显示文件元数据:stat
- 文件访问权限
- 修改文件权限:chmod
- 文件内容查看
- 基本显示:cat、tac
- 显示行号:nl
- 分屏显示:more、less
- 取首尾n行:head、tail
- 文件管理
- 输出重定向:>
- 管道:|
- 清屏:clear
- 切换工作目录: cd
- 显示当前路径:pwd
- 创建目录:mkdir
- 删除文件:rm
- 建立链接文件:ln
- touch:创建空文件
- 查找文件:find
- 文本搜索grep
- 拷贝文件:cp
- 移动文件:mv
- 归档管理:tar
- 文件压缩解压:gzip
- 文件压缩解压:zip、unzip
- 系统管理
- 查看当前日历:cal
- 显示或设置时间:date
- 查看网络状态:netstat
- 查看进程信息:ps
- 动态显示进程:top
- 终止进程:kill
- 关机重启:reboot、shutdown、init
- 检测磁盘空间:df
- 检测目录所占磁盘空间:du
- 查看或配置网卡信息:ifconfig
- 测试远程主机连通性:ping
- vim
- 什么是 vim?
- 为什么要学习vim?
- 使用vim打开文件
- 工作模式
- 命令模式
- 输入模式
- 底行模式
- Shell编程
- 介绍
- shell脚本命名
- shell语法
- 第一个hello world
- 单行注释
- 变量
- 定义变量
- 使用变量
- 只读变量
- 删除变量
- 从键盘获取值read
- 案例一
- 案例二
- 案例三:读取多个值
- 变量类型
- 系统变量
- 常见系统环境变量
- 局部变量
- Shell 函数
- 案例一:
- 案例二:带参数的函数
- 文件包含(调用其他文件)
- shell数据类型
- 字符串
- 数组
- 定义数组
- 读取数组元素值
- 获取数组的长度
- Shell基本运算符
- 算术运算符
- 关系运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
- test命令
- Shell流程控制
- if 语句语法格式
- if else 语法格式
- if else-if else语法格式
- for循环格式
- while循环
- 死循环语法格式
- until 循环
- case
- 跳出循环
- 参考目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
由于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.txtSize: 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 11月 21 14:02 ./
drwxr-xr-x 31 python python 4096 11月 21 13:34 ../
-rw-rw-r-- 1 python python 51 1月 20 2017 1.txt
-rw-rw-r-- 1 python python 55 1月 20 2017 2.txt
-rw-rw-r-- 1 python python 51 1月 20 2017 3.txt
-rw-rw-r-- 1 python python 10240 11月 21 14:02 test.tar
python@ubuntu:~/test$ rm -rf *.txt
python@ubuntu:~/test$ ll
总用量 20
drwxrwxr-x 2 python python 4096 11月 21 14:03 ./
drwxr-xr-x 31 python python 4096 11月 21 13:34 ../
-rw-rw-r-- 1 python python 10240 11月 21 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 11月 25 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 11月 25 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 11月 25 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; doecho "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 随机生成一个 0 至 32767 的整数;
HOSTNAME 主机名
系统环境变量输出演示
局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
Shell 函数
shell中函数的定义格式如下:
[ function ] funname[()]
{action;[return int;]
}
案例一:
#!/bin/bashfunWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
输出结果:
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
案例二:带参数的函数
#!/bin/bashfunWithParam(){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/bashurl="http://www.baidu.com"
test2.sh 代码如下:
#!/bin/bash#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.shecho "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/bashmy_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/bashmy_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=Decho "数组的元素为: ${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/basha=10
b=20val=`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 ]
thenecho "a 等于 b"
fi
if [ $a != $b ]
thenecho "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/basha=10
b=20if [ $a -eq $b ]
thenecho "$a -eq $b : a 等于 b"
elseecho "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
thenecho "$a -ne $b: a 不等于 b"
elseecho "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
thenecho "$a -gt $b: a 大于 b"
elseecho "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
thenecho "$a -lt $b: a 小于 b"
elseecho "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
thenecho "$a -ge $b: a 大于或等于 b"
elseecho "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
thenecho "$a -le $b: a 小于或等于 b"
elseecho "$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/basha=10
b=20if [ $a != $b ]
thenecho "$a != $b : a 不等于 b"
elseecho "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
thenecho "$a 小于 100 且 $b 大于 15 : 返回 true"
elseecho "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
thenecho "$a 小于 100 或 $b 大于 100 : 返回 true"
elseecho "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
thenecho "$a 小于 5 或 $b 大于 100 : 返回 true"
elseecho "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
执行脚本,输出结果如下所示:
10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
#!/bin/basha=10
b=20if [[ $a -lt 100 && $b -gt 100 ]]
thenecho "返回 true"
elseecho "返回 false"
fiif [[ $a -lt 100 || $b -gt 100 ]]
thenecho "返回 true"
elseecho "返回 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/basha="abc"
b="efg"if [ $a = $b ]
thenecho "$a = $b : a 等于 b"
elseecho "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
thenecho "$a != $b : a 不等于 b"
elseecho "$a != $b: a 等于 b"
fi
if [ -z $a ]
thenecho "-z $a : 字符串长度为 0"
elseecho "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
thenecho "-n $a : 字符串长度不为 0"
elseecho "-n $a : 字符串长度为 0"
fi
if [ $a ]
thenecho "$a : 字符串不为空"
elseecho "$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/bashfile="/var/www/runoob/test.sh"
if [ -r $file ]
thenecho "文件可读"
elseecho "文件不可读"
fi
if [ -w $file ]
thenecho "文件可写"
elseecho "文件不可写"
fi
if [ -x $file ]
thenecho "文件可执行"
elseecho "文件不可执行"
fi
if [ -f $file ]
thenecho "文件为普通文件"
elseecho "文件为特殊文件"
fi
if [ -d $file ]
thenecho "文件是个目录"
elseecho "文件不是个目录"
fi
if [ -s $file ]
thenecho "文件不为空"
elseecho "文件为空"
fi
if [ -e $file ]
thenecho "文件存在"
elseecho "文件不存在"
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
thencommand1 command2...commandN
fi
if else 语法格式
if condition
thencommand1 command2...commandN
elsecommand
fi
if else-if else语法格式
if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi
for循环格式
for var in item1 item2 ... itemN
docommand1command2...commandN
done
while循环
while condition
docommand
done
示例
#!/bin/bash
int=1
while(( $int<=5 ))
doecho $intlet "int++"
done
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按Ctrl-D结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
doecho "是的!$FILM 是一个好网站"
done
运行脚本,输出类似下面:
按下 <CTRL-D> 退出
输入你最喜欢的网站名:淘宝
是的!淘宝 是一个好网站
死循环语法格式
while :
docommand
done
或者
while true
docommand
done# 或者
for (( ; ; ))
until 循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
until condition
docommand
done
condition 为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令允许跳出所有循环(终止执行后面的所有循环)。
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
#!/bin/bash
while :
doecho -n "输入 1 到 5 之间的数字:"read aNumcase $aNum in1|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