【第一小结】Linux 基础以及安装
- linux 是一个UNIX类操作系统
- Linux 具有UNIX 的所有特性并且具有自己的特点:
- 开放性:源码开放,遵循OSI国际标准
- 多用户
- 多任务
- 强大的稳定性:可以常年累月的开机不关机,工作
- 良好的用户界面
- 设备独立性:在Linux中只有文件的概念,Linux 没有可执行程序.exe这种说法,都只是看成一种文件
- 丰富的网络功能:Linux独有
- 安全性
- 良好的可移植性
- 标准兼容性:Linux是一个与POSIX相兼容的操作系统
- X Windows系统:适用于unix 机器的一个图形系统
- 内存保护模式:Linux 使用处理器的内存保护模式来避免进程访问分配给系统内核或者其他进程的内存。
- Linux的主要组成部分:Linux内核、Linux shell 、Linux 文件系统、Linux 实用程序(utilities)和Linux应用程序(applications)
- 【Linux 内核】是Linux心脏,控制硬件、管理内存、提供接口、处理基本I/O;管理文件系统,为程序分配内存和CPU时间等。
- 【linux shell】常见由:bourne shell(sh)、korn shell (ksh)、C shell(csh)、Bourne-again shell(bash)
- linux内核版本介绍:分为两种版本一种是内核版本(kernel)、一种是发行版本(distribution)
- major.minor.patchlevel 内核版本,其中major 为主版本、minor 为此版本如果minor 为奇数说明这个版本不是很稳定,minor 为偶数说明这个版本会比较稳定;patchlevel 表示修改次数。
- 有几百种发行版本,目前比较流行的有:centos、ubuntu、red hat等等。
- linux与其他操作系统的基本区别(Windows、MS-DOS、OS/2、UNIX)
- MS-DOS没有完全发挥出CPU 的所有功能,linux开发了所有特性。并且是在CPU的保护模式下工作的。
- linux与unix相比,linux 是免费的、linux支持大多数硬件、unix更适用于相对成熟的领域。例如一些安全工程等最顶尖的硬件支持项目等。
- linux 与windows 相比:linux 的应用目标是网络、可选GUI、文件扩展名可设置、重新引导、命令区分大小写。
- linux安装这里就不多说了centos 就直接根据引导安装就好了
- linux的用户类型:linux 分为根用户(系统管理员)和普通用户两大类
- root就是根用户,拥有超级管理员的权限
- 普通用户由root 用户创造
- 所有用户在系统中有唯一的用户名
- 普通用户命名的时候不能够以数字、下划线作为第一个字符。
- linux的运行级别:所谓运行级别就是操作系统中当前正在运行的功能级别,这个级别从0~6 具有不同的功能。
- 运行级别可以通过telinit 命令来通知init
- 具体见下表:
级别 | 功能 |
0 | 关机 |
1 | 单用户模式 |
2 | 多用户模式 |
3 | 完全多用户模式 |
4 | 没有用到 |
5 | X11 |
6 | 重启 |
- man 命令与help 、info命令的区别
- help 命令用于显示shell 内部的帮助信息,他只能显示shell内部的命令帮助信息,如果想要显示外部命令的帮助信息只能使用man 或者是info
- man 命令通过man指令可以查看linux 中的指令、配置文件、编程帮助等信息。
- info 命令是man 命令更详细的一个命令。但是使用的时候man会更加方便一点。man 只有一页,而info 可能会有更多页。
- who 命令
- 语法:who [lqsu]
- l -- 显示系统中登录的终端
- q -- 显示本地系统上的用户名称和用户总数
- s -- 显示登录用户名、终端号、日期和时间
- u -- 显示此时在系统中的用户
- uname 命令
- uname [-rnv]
- r -- 显示操作系统的内核发行号
- n -- 显示网络上本机的节点名
- 显示操作系统的内核版本号
- cal 命令
- cal [month] [year]
- 作用是显示日历month 的范围是1~12;year 的范围是1~9999
【第二小结】Linux 的文件系统
- linux 文件系统概述:通常把操作系统中与管理文件有关的软件和数据成为文件系统。
- linux 文件系统是采用树形结构的,根目录是/ 其他所有目录都是根目录的延伸
- linux 文件系统的特点:
- 采用树形结构,从根目录开始
- linux 的虚拟文件系统允许众多不同类型的文件系统共存,并支持跨文件系统的操作。
- linux 的文件是无结构字符流式文件,不考虑文件内部的逻辑结构,只把文件简单看做是一系列字符的序列。
- linux 的文件可由文件拥有者或超级用户设置相应的访问权限而受到保护。
- linux 把所有外部设备看做文件,可以使用与文件系统相同的系统调用和函数来读写外部设备。
- linux文件系统的组成
下面介绍每个目录的含义:
/bin :二进制目录
/home :用户主目录的基点 目录,默认情况下每个用户的主目录都设置在该目录。
/lib :存放标准程序设计库的目录,又叫动态链接共享库目录,目录中存放的文件作用类似Windows 里的dll 文件
/etc:存放系统管理和配置文件目录
/dev :存放设备特殊文件目录,例如声卡文件,磁盘文件等
/usr : 最庞大的目录,存放应用程序的目录
/proc:虚拟目录,是系统内存的映射,可直接访问这个目录来获取系统信息。
/root :系统管理员的主目录
/var :存放系统产生的经常变化文件目录,例如打印机、日志文件等等
/tmp:存放公用临时文件目录
- linux 文件系统类型(ext文件系统)
- ext 是扩展文件系统。
- 但是由于ext 在稳定性、速度和兼容性方面存在缺陷,现在已经很少使用了
- 后续linux 引入了 二级扩展文件系统(ext2),ext2是linux 默认的文件系统
- ext2是非日志文件系统,在关键行业应用中,这是个致命缺陷
- 再后来ext2改进成为了ext3 ,ext3是一个日志文件系统,并且与ext2兼容
- ext3的特点:(1)高可用(恢复快、异常关机不需要检查)(2)数据的完整性(3)文件系统的速度快(4)数据转换(ext2 与ext3相互转换十分的方便,不需要格式化重新分区等等,只需要一个命令:tune2fs)(5)多种日志模式(journal日志、ordered预定、writeback回写);其中journal 模式将所有数据和元数据的改变都计入日志,安全,但是速度慢、需要更多额外磁盘访问;ordered 模式只有对文件系统元数据的改变才计入日志,但是保证数据在元数据之前被写入磁盘,是默认的ext3日志模式;writeback模式只有对文件系统元数据的改变才写入日志,但是元数据与数据之间的顺序不保证,这个是最快的日志模式
- 后来呢出现了ext4 文件系统(ext3与ext4可以任意相互转换)ext4 是一种更高级的文件系统
- 其他文件系统介绍(MS-DOS:使用在DOS\MS\OS/2的操作系统上;Swap:linux 中的交换分区;NTFS :Windows NT 文件系统)
- 在linux中,每一个分区都是一个文件系统,都有自己的一个目录结构层次。linux 的最重要特征就是支持多种文件系统;linux 之所以支持多种文件系统,是因为其存在一个虚拟的文件系统(VFS)
- linux 文件目录的概念
文件:是一组有名字由创建者定义的,具有文件名的一组相关元素的集合,文件可以是文本、视频、音频。
文件名:最多255字节、不可以使用"/"、转义字最好不要用、开头避免使用+ . - (linux 中. 开头是隐藏文件)
文件扩展名:linux中是有扩展名但是扩展名不代表这个文件可以执行,这个和Windows不太一样,linux 文件能不能执行与你文件的执行权限有关系。linux 的文件扩展名其实是任意长度的。
文件类型:
普通文件。也叫作常规文件,'-rw-r--r--' 其中第一个字符- 代表这个是一个普通文件。
目录文件。'drwxr-xr-x'的字符串,其中第一个字母d 就是代表目录文件。
设备文件。在Linux中输入输出设备被看做是特殊文件。'crw-rw-rw' c代表字符设备;'brw-rw----' b代表块文件。
符号链接文件。内容只有一个字符串,软连接的意思。以l 开头。
目录:是linux 文件系统中的一种特殊文件。
工作目录和用户主目录:工作目录是用户登录到linux 后所处于的目录;用户主目录是/home/ 下
路径:用/ 分开(Windows和它不一样,Windows是\)。分为绝对路径和相对路径。
- 文件操作命令(持续更新)
- cat
- 将文件以及内容输出到标准输出(屏幕)或者文件中(重定向)
- more
- 展示文本文件内容。一次一屏,满屏后停滞,可以做其他操作:回车则是向下一行移动、空格是显示文本的下一屏内容、d 表示向下半屏(默认11行)、b 表示向上显示一整屏、q 表示退出。
- less
- 和 more相似。允许用户page UP 、page DOWN
- -N 显示行号。
- tailf
- 等同于tail -f
- -n 表示 打印几行(末尾)
- -c 表示 打印几个字节(末尾)
- head
- -n 表示 打印几行(首行开始)
- -c 表示 打印几个字节(首行开始)
- cat
- 改变文件或者目录存取权限的命令
- 用户和用户组
- linux 内部使用UID标识各个用户,linux为每个文件都分配了一个文件所有者,成为文件主,文件主为linux 的用户,对文件的控制取决于文件主或超级用户。
- 用户组是具有相同特性的用户的集合体。linux 中的每一个用户都属于一个用户组。系统可以对一个用户组的所有用户进行集中管理。linux中使用GID来表示用户组。
- linux 中规定了4中类型的用户:超级用户、文件主、同组用户、其他用户。
- 存取权限
- 就是用来确定谁可以通过何种方式对文件和目录进行访问。linux系统中规定了三种:读(r)、写(w)、执行(x)
- 读:对文件只允许指定用户展示里面内容;对文件夹只允许展示里面有什么样的文件
- 写:对文件允许指定用户增删改查(打开、修改);对文件夹允许从该目录中删除或添加新的文件。
- 执行:对文件就是说可以执行;对目录就是说可以使用cd 进入这个目录、可以在这个目录下进行查找。
- 用户和用户组
- 【chmod 命令】
- rwx rwx rwx (文件主权限) (组用户权限) (其他用户权限)
- 格式:chmod [who] [opt] [mode] 文件或目录名
- who 表示对象 :
- u 表示文件所有者
- g 表示同组用户
- o 表示其他用户
- a 表所有用户
- opt 表示操作:
- + 表示添加某个权限
- - 表示取消某个权限
- = 表示赋予给定的权限,并且取消原有的权限
- mode 表示权限:
- r 表示可读
- w 表示可写
- x 表示可执行
上面说的事用字符表示的权限增减,其实我们还可以使用字符来代替
rwx看成二进制数,如果该位有权限,用1 表示,没有则用0 表示,例如:rwx r-x r- - 可表示为 111 101 100 , 再将其转换成一位八进制数就是754
常见权限数字表示如下表:
权限 | 对应二进制 | 二进制对应八进制 |
rwx rw- rw- | 111 110 110 | 766 |
rw- r-- r-- | 110 100 100 | 644 |
rwx r-x r-x | 111 101 101 | 755 |
r-- --- --- | 100 000 000 | 400 |
r-x r-- r-- | 101 100 000 | 540 |
- 【chgrp命令】
chgrp [选项]... 所属组 文件或目录...
说明:chgrp 命令改变指定文件所属组的用户组,其中所属组可以使用户组的ID 也可以是用户组的组名。文件是用空格分开的要改变的文件列表,支持通配符。一般来说 ,linux 中一般只有超级用户才有这个权限。
一般用的选项是:-R //递归改变目录以及下面的所有子目录和文件的属组。
- 【chown命令】
格式:chown [选项]... [用户][:[组]] 文件...
说明:chown 命令将指定文件的拥有者改为指定的用户或组。用户可以是用户名或者是用户ID。文件是用空格隔开的文件列表,支持通配符。在linux下一般只有超级用户才能使用该命令。
一般的选项是:-R /递归方式将其该变所属用户
- 连接文件命令
链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。linux系统下的链接有两种一种是硬链接一种是软连接(符号链接)。
硬链接:指通过索引结点来进行的链接。在linux中,内核为每一个新创建的文件分配一个Inode(索引结点),文件属性保存在索引结点里,系统是通过索引结点(而不是文件名)来定位一个文件。在linux中可以通过命令让多个文件名指向同一索引结点,这样一个文件就有不同的文件名。
硬链接有两个限制:
(1)不允许给目录创建硬链接
(2)只有在同一文件系统中的文件之间才可以创建硬链接
软连接:软连接文件包含到另一个文件的路径名。当需要在不同的目录下用到相同的文件时,不需要再每一个目录下都存放该文件,只要在某个固定的目录下存放,然后在其他的目录下用命令link即可。这样不必重复的占用磁盘空间。
软连接没有硬链接的限制,可以给目录创建链接,可以链接不同文件系统的文件。当然,软连接也有硬链接没有的缺点。如果一个文件的绝对路径发生变化,则软连接会失效,但是硬链接不会出现这个情况。此外,软连接文件还需要系统额外空间用于建立新的索引结点和保存源文件的路径。
- 【ln 命令】
格式:ln [选项]... 源文件或目录 目标文件或目录
常用选项: -s :对源文件建立软连接而不是硬链接。
例子:
[root@localhost tmp]# ls -il
总用量 2008
67289348 -rw-r--r--. 2 root root 294 4月 10 18:10 asdfasdfasdf.txt
67289348 -rw-r--r--. 2 root root 294 4月 10 18:10 asdfasdfasdf.txtas
67289347 lrwxrwxrwx. 1 root root 21 4月 11 15:14 asdfasdfasdf.txtas.ruan -> /tmp/asdfasdfasdf.txt
前面的数字是inode号
硬链接的数目会添加而软连接的链接数目不会添加
硬链接文件大小跟源文件相同。软连接不同。
硬链接有自己的文件名,软连接的文件名通常是指向其链接的原文件。
【第三小结】Linux 的vim 编辑器
- 首先linux中vi是一个全屏幕编辑器
- 现在的vi版本基本都是运行了vim(VI Improved),vim在VI的基础上增加了很多新功能。VI 与VIM 的使用方法一致。
- linux中有一种编辑器那就是行编辑器
- VIM的工作模式:命令行模式(command mode)、插入模式(insert mode)、末行模式(last line mode)
- 【命令行模式】
在shell 环境中启动VIM的时候,初始就是进入命令模式。在该模式下键盘上输入任何字符都作为编辑命令来解释。如果输入的命令合法那就执行不合法就不会执行,报错;要注意这个模式输入不会再屏幕上打印东西也不需要回车键确认。[按下退出键就可以进入到命令行模式]
- 【插入模式】
只有在插入模式下才可以进行文本输入。[需要在命令行模式下插入命令i、附加命令a、打开命令o、修改命令c、替代命令r、替换命令s都可以进入插入模式]
在这个模式下所有的输入都会被VIM记录到文件中
想要回到命令行模式那就按下退出键
- 【末行模式】
[在命令模式下按下:(英文冒号)进入末行模式]此时vim 会将光标停留在显示窗口最后一行显示一个: 等待用户输入命令。
- VIM的编辑命令
- 【移动光标】
可以再命令行模式和插入模式都可以;使用方向键;也可以使用H(左)J(下)K(上)L(右)
- 文本插入
- 插入(i \ I)
- 附加(a \ A)
- 打开(o \ O)
- 文本删除
- x表示删除当前字
- X表示删除光标左边字符
- dd 表示删除一整行
- dw表示删除当前字
- 文本复制与粘贴
- yy:表示复制行
- p: 表示粘贴
- 文本查找
- /+字符串 开始搜索(向下)字符串下一次出现的位置
- ?+字符串 开始搜索(向上)字符串上一次出现的位置
- 重复与取消
- u表示取消
- 操作后按下.. 表示重复两次(其他同理)
【第四小结】Linux 系统管理基础
- linux系统启动过程
| (加电)
加载BIOS
|
预引导(LILO/GRUB)
|
加载系统内核映像(kernel boot)
|
init ===rc.sysinit/rc
|
建立用户接口 === login
|
shell ---->用户执行linux命令
【加载BIOS】
BIOS包括CPU、设备、启动顺序、磁盘、内存、时钟信息
BIOS第一步是加电自检,然后依据BIOS内设置的引导顺序从硬盘、软盘或者CDROM中读入“主引导记录”(MBR;master boot record;大小512字节,其中存放了预启动信息、分区表信息)系统找到BIOS所指定的硬盘的MBR以后,将其调到物理内存中。其实被调到物理内存的内容是Boot Loader,具体到用户的PC机,就是LILO 或者 GRUB。
【加载Boot Loader】
Boot Loader 是在操作系统内核运行之前运行的一个小程序,这段小程序,可以初始化硬件设备信息、建立内存空间的映射图。从而将系统的软硬件环境逮到一个合适的状态,以便为最终调用操作系统内核做好准备。
Boot Loader 分为很多种其中GRUB 和LILO 是常见的Boot Loader 。现在大多数linux 版本都是使用GRUB 。
【加载内核映像】
根据GRUB设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一些列的初始画函数并初始化各种设备。完成linux 核心环境的建立。
【执行init进程】
内核被夹在后,第一个运行的程序就是/sbin/init 进程,他会读取/etc/inittab文件,其中存放了系统启动的运行级别等信息,系统根据此文件的设置来进行初始化工作。
在设置了运行级别后,init回调用脚本程序负责启动或者停止该运行级别特定的各种服务,由于需要管理的服务很多,因此需要rc脚本程序、(rc 位置在/etc/rc.d/rc)负责为每一个运行级别按照正确的顺序调用相应的命令脚本程序。
【进入登录状态】
此时系统为用户建立登录接口,等待用户输入ysername 以及password。
登陆成功后,系统会给出shell提示符。开始执行shell。
- 系统的运行级别
linux 系统的运行级别分为7种
运行级别 | 释义 |
0 | 系统停机状态,默认不允许设置,不然开不了机 |
1 | 单用户;root权限;用于系统维护;禁止远程登录 |
2 | 多用户(无NFS支持;NFS是网络文件系统) |
3 | 完全多用户(有NFS支持,启动后会进入命令行;标准的启动级别) |
4 | 系统保留未使用 |
5 | 多用户模式。GUI图形化界面 |
6 | 系统正常关闭并重启,默认情况不可设置不然不可以启动 |
- 查看运行级别
runlevel
- 进入其他运行级别
init N
- linux 系统关闭
linux关闭系统有三种:关掉、不关电源只关机、重新引导。
【shutdown命令】
只有使用shutdown才可以安全的关闭linux
只有root才有权限
shutdown 用shell写的
执行后会以广播的形式通知正在系统中工作的所有用户,系统将在指定的时间内关闭,请保存文件,停止作业,注销用户。此时login用户被冻结。当所有用户从系统中注销或者指定时间到了,shutdown就会发送信号给init程序,要求系统改变运行级别
选项
-f 重启时不执行fsck(检查和修复文件系统)
-F重启时执行fsck
-h将系统关机
-k只是发送信息给所有用户,不会真正关机
-n不调用init程序关机,转成shutdown程序自己进行(加快关机速度,但是不建议)
-rshutdown 后重启系统
常用shutdown -h now //立即关机
【halt命令】
halt 是最简单的关机命令
halt 直接执行就可以关机了
halt 也可以带参数:
-f 没有调用shutdown而强制关机或重启
-i 关机或重启之前,关掉所有的网络接口
-p 关机时调用poweroff,此选项为默认选项
【reboot命令】
与halt类似,不同的地方在于reboot是重启,halt是关机
【init命令】
init 切换 系统状态
init 0 关机
init 6 重启
- 用户管理
超级用户root
普通用户
特殊用户
除了超级用户和普通用户外,在linux系统中还存在一些特殊的与系统和程序服务相关的用户。例如 bin daemon shutdown halt 等等。这些都是任何linux系统默认都要安装并要求的,例如 mail news games gopher ftp mysql 以及sshd 等账号则是与具体的服务或程序组有所关联,如果没有这些程序,系统也是可以正常运行的。
默认情况下这些用户都是不可以登录的。如果给这些用户授权登录口令后,就可以使用这些用户登录系统,但是为了安全,一般不会给这些用户授权口令。
- linux 的用户管理的信息包括:
(1)用户账号(用户名)的增删改
(2)组账号的增删改
(3)用户账号属性信息的增删改
(4)账号的密码修改
(5)账号所属组信息修改,组ID等
- linux 的用户管理的方法
(1)GUI
(2)相关配置文件(/etc/passwd 文件 /etc/shdow文件 /etc/group 文件)
(3)用户管理命令
这里主要介绍下用户管理命令
【useradd 命令】
作用是添加用户
useradd yyq
-d 指定用户主目录
-u 指定用户ID
-g 已存在一个组,新增用户要加入主要组
-G 已存在一个组,新增用户要加入附加组
-c comment 用户的注释信息
【usermod命令】
可以修改用户属性
【userdel命令】
删除用户
-r 说明不仅要删除用户还要删除用户的主目录
【groupadd】
新建用户组
groupadd -g groupname
【groupmod】
修改指定组的信息
【groupdel】
删除组
【groups】
查看自己属于哪个组
- 设备管理
linux 中的设备文件分为:字符设备、块设备、网络设备三种。
字符设备
是linux最简单的设备文件。数据组织的单位是字节。
对字符设备发出读、写请求的时候。实际的硬件I\O就会立即做出相应。
一般来说鼠标、串口、键盘等都是属于字符设备。
块设备
是文件系统的基础,数据组织的单位为块。系统对其读写数据时,需要使用缓冲区。再块文件读写文件的时候需要用到一块系统内存作为缓冲区。当用户进程对设备请求能够满足要求的时候就返回请求的数据,如果不能就调用请求函数来进行实际的I\O操作。
硬盘、光盘驱动器等都是块设备
网络设备
网络适配器等
所有的设备文件都是放到/dev下,都是linux 系统在安装的时候自动创建的。
【第五小结】Linux 网络管理
一些常用的网络命令(这里太熟悉了,介绍下不太熟悉的netstat)
//回头复习下tcpdump 的教程以及数据包的分析
【netstat 命令】
用于查看网络状态
netstat -antpu //常用查看命令
netstat -a //显示所有已经建连接的接口
netstat -rn //显示路由表状态,
其他参数:
-s 按照各个协议直接分别显示其统计数据
-t 显示tcp协议的数据
-u 显示UDP协议的数据
一些常用的服务器搭建(mail服务器、FTP服务器、DNS服务器)
【第六小结】Linux shell 编程
- shell 简介
在各类操作系统中,用户与操作系统内核打交道都要通过特定的接口。shell是linux 系统的外壳,为用户与linux内核之间的交互提供媒介。同事shell管理用户和操作系统之间的交互,等待用户输入命令,向操作系统解释用户输入,并且处理各种各样的操作系统输出。
说白了shell就是一个用户接口、命令解释器。
- shell 种类介绍
sh:bourne(壳牌) shell,在所有的unix上都可以使用。
csh:C shell
ksh:Korn shell
- linux中可执行文件的分类如下
linux 命令:放在/bin /sbin下的文件
内置命令:基于效率考虑,将一些常用的命令作为内置
实用程序:放在/usr/bin 之类的文件
用户程序:经过编译的可执行文件
shell 脚本:shell 写的脚本
那么当输入一个命令后,shell 首先判断它是否是内置命令,如果是就通过shell 内部的解释器进行解释。将其结果交给内核完成。
如果是外部命令或者实用程序就试图在硬盘中查找其命令并将其调入内存,再将其解释为系统功能调用并转发到内核进行执行。
在shell 查找命令的时候,有两种情况,第一种是用户给出了命令的路径。第二种是没有给出路径(shell就在环境变量PATH所规定的路径中依次去寻找,如果有就调用到内存,如果没有就报错)
找到以后,shell 将启动一个新的进程对其执行,并将命令上的参数、选项传递给可执行文件,这个过程成为睡眠(sleep)状态,当命令(可执行文件)执行完毕,又将shell 唤醒,然后等待下一次输入。
- 标准的输入\输出
执行一个shell命令时,linux通常会自动打开三个文件:标准输入(stdin:通常对应终端键盘)、标准输出(stdout:对应屏幕)、标准错误输出(stderr:对应屏幕)
【输入重定向】
command [参数] < 文件名
把命令或者是可执行的标准输入重定向到指定文件中。也就是说输入不来自键盘,而是来自一个文件。
【输出重定向】
command [参数] > 文件名// >> 是追加
默认情况下> 后面的文件存在,则这个文件将会被重写
- 管道
shell 中使用管道将一个命令的输出作为另一个命令的输入。
管道破裂:
- 特殊字符
通配符(*)
(*)代表任何字符串,包括0个
(?) 代表任何单个字符
([]) 代表指定的一个字符范围,只要文件中[]位置处的字符在[]中指定的范围内,那么这个文件名就会和[]匹配。
引号:单引号、双引号、反引号
单引号括起来的字符都当成是普通字符出现,包括特殊字符
双引号由双引号括起来的字符例如($ \ 、‘ “)来说都保留原始的意思。
反引号表示反引号内被解析成shell命令
注释:shell中使用#作为注释
- 别名
命令别名通常是其他命令的缩写。用来减少键盘输入。命令格式为
alias alias-name = 'original-command'
定义别名以后,除非退出bash 不然别名是不会失效的。
- 命令历史
history
【shell 脚本】
- 什么是shell 脚本其实就是shell script。
- shell是脚本不需要编译。是一行一行的按顺序执行的。
- shell 脚本的执行方式
- 加权限,然后使用shell 文件名直接执行
- 这种方式表示启动一个新的shell执行该脚本。但是这个方式执行时,当前系统path变量中如果没有包含这个目录,需要加上./或者是绝对路径执行
- sh 加上shell 名称
- 这种方式表示启动一个新的shell执行脚本。
- shell脚本名(这种方式是在当前shell 下执行的)
- 加权限,然后使用shell 文件名直接执行
- shell 变量
一个变量就是一个被命名的一块存储空间
一个shell变量名字可以包含数字、大小写字母 下划线开头不允许是数字。
大小写敏感
和python一样不需要提前声明直接使用
【环境变量】
使用env<command>命令来查看
【用户自定义变量】
作为临时的存储空间,过程中可以改变,名字长度不限,使用小写变量名。一个没有被初始化的shell变量自动地被初始化为一个空串。
var_name =value
//如果字符串里包含空格,就必须用引号它它们括起来。
//注意等号两边不能有空格。
引用变量就在前面加上$
清除变量使用:unset varname
【位置变量】
shell 提供的位置变量由 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
其中$0 存放脚本名,然后依次排开
当命令行上命令参数超过9个,shell提供了shift 命令可以把所有参数变量左移一个位置,使$2 变成 $1, 原来的$1将会被丢弃,$0保持不变
【特殊变量】
$# 表示传递给脚本的实际参数个数
$$ 当前shell脚本的进程号
$@ 表示位置参数的值
$* 位置参数的值,各个参数之间在环境变量IFS中定义的字符隔开
$! 上一个后台命令的进程号
$? 执行最后一条命令的退出状态
- shell 脚本的输入输出
输入命令 read
从终端上读取一个参数 一般不使用引号
格式:read var_name [var_name2 。。。 ]
输出命令 echo
export命令:
可将在shell脚本中定义的变量导出到子shell中,并使之在子shell中有效。
- shell 条件测试
格式如下:
(1)test 条件表达式
(2)[条件表达式]
使用第二种方法需要在[]前后保留一个空格不然shell 会报错
例子;判断文件是否存在
if test -f yyq.txt
then
......
fi
if [ -f file ]
then
.....
fi
【字符串比较条件】
字符串比较 | 结果 |
string1 = string2 | 相同为真 |
string1 != string2 | 不同为真 |
-n string | 字符串不空则为真 |
-z string | 字符串为空(一个空串)则为真 |
【算数比较条件】
算数比较 | 结果 |
表达式1 -eq 表达式2 | 相等为真 |
表达式1 -ne 表达式2 | 不同为真 |
表达式1 -gt 表达式2 | 1大于2为真 |
表达式1 -ge 表达式2 | 1大于等于2为真 |
表达式1 -lt 表达式2 | 1小于2为真 |
表达式1 -le 表达式2 | 1小于等于2为真 |
!表达式 | 表达式假为真 |
【文件测试】
文件比较 | 结果 |
-d file | 如果文件是一个目录则为真 |
-e file | 如果文件存在则为真,通常来说整个用不了,一般都用-f |
-f file | 如果文件存在则为真 |
-g file | 如果文件的SGID位置被设置则为真 |
-r file | 如果文件可读则结果为真 |
-s file | 如果文件长度不为0则为真 |
-u file | 如果文件的SUID位置被设置则为真 |
-w file | 如果文件可写结果为真 |
-x file | 如果文件可执行则结果为真 |
- 逻辑运算
【AND运算】
AND运算允许用户按照这样的方式执行一系列命令:只有前面的运算都执行后成功才会执行 后面的语句。AND 在linux 中为&&。
【OR运算】
OR列表结构允许持续执行一系列命令直到有一条命令返回的是false,它右边的下一条命令才能被执行。使用 ||
- shell 的算术运算
所有的shell 变量的值都以字符串的形式存储。如果需要做算术运算,则需要先转换成字符串才能够进行运算,得到结果以后在返回字符串,以保证Shell的执行正确
bash 使用3中方法对数值数据进行算术运算
(1)使用expr命令
(2)使用shell 扩展$((expression))
(3)使用let 命令
【expr命令】
expr 命令将它的参数作为一个表达式来求职
expr expression
例子:
注意:在使用expr的时候,运算符前后要有空格,且乘法运算需要使用转义(\)即(\*)的形式
【$((expression))】
该命令用于计算一个expression并返回它的值
例如
使用$((expression))的时候,内部如果使用乘法,不需要转义
【let命令】
用来求算术表达式的值,如果最后的值为0,则let 命令返回1,否则返回0。语法格式为
let expression
- shell控制结构
【if语句】
if 后面不像是python 一样需要:
shell 不是缩进敏感的编程语言
可以使用elif
一般与[] 命令合用,在使用[]的时候需要在[ ] 这两个符号的前后加上空格。不然会报错
if 还可以嵌套
如果在写的时候需要与else在同一行的语句前面需要使用“;”
- case语句
case是一个多分支结构,根据变量与哪种模型匹配确定执行相应的语句序列
case variable in //case支持匹配模式,每一个模式中还可以使用通配符或逻辑符号
partern1) statements;;
partern2) statements;;
..
parternN) statements;;//每个模式行都是以双分号结尾。
*) statements;;
esac
- for 语句
for 结构可以用来循环处理一组值,
for variable in values
do
statements
done
其中variable 表示变量名
例子
values里面变量 用空格隔开
还可以这样写
- while
默认情况下shell中的变量值都是字符串,所以for在处理一些对于字符串的循环上十分方便,但是在需要执行特定次数命令的场合就显得有些笨拙了。
这个时候就需要while来协助他
while condition
do
statements
done
- until
和while刚好相反,判断条件为真的时候退出循环
- break 以及 continue
默认情况下break 只跳出一层循环
continue跳出当前循环
- shell 函数
在一个脚本程序中执行另外一个脚本程序要比执行一个函数慢得多。返回执行结果变得更加困难,而且可能存在非常多的小脚本。这个时候使用函数是一个正确的方向
【函数定义】
shell 定义一个函数
function_Name() {
statements
}
//它和python 还不太一样,python 是使用def xx
【函数调用】
通常将函数看成是脚本中的一段代码。在使用函数前必须先定义函数。使用时利用函数名直接调用
函数中可以使用return 命令让函数返回
return 默认返回0(当他没有被明确声明的时候)返回0代表执行成功,返回1 表示有错
【第七小结】shell 一些高难度的东西
【gdb程序调试工具】
程序中的错误通常分为:
(1)编译时出错
(2)运行时出错
(3)逻辑错误和语法错误
找到这些错误并加以修正的过程就叫做debug
gdb是linux 一个强大的调试工具,用来调试c 或者是C++
具体可以查下网上
【linux 中的进程间信号】
linux 程序间通信通常由管道、消息、共享存储区、信号等方式
这里主要讨论信号
kill -l 命令可以查看linux 支持几种信号
常见的几种
SIGHUP(sighup):终端发起的终止信号
SIGINT(sigint):来自键盘的中断信号(ctrl+c)
SIGQUIT(sigquit):来自键盘的退出信号(ctrl+\键)
SIGFPE:浮点异常信号
SIGKILL :该信号结束接收信号的进程