Linux指令总结
这是我根据老师的课件整理的,可以存到手机上,需要指令时直接查询文字,比较方便。
word板在这个链接:https://pan.baidu.com/s/13nZNekKO0px3N8Lt7rB2QQ
提取码:6hht
目录
一、文件属性
改变组群chgrp
改变拥有者chown
改变权限chmod 分为数字法和符号法两种方式
(一)chgrp groupname file/dir
该指令用来改变一个文件或目录的组群
1、groupname是目标组群名称,而非初始组群
2、groupname需存在于/etc/group中,即组群为已注册合法组群
eg:用户root创建了一个文件a,现在要将其组群改为swh
chgrp swh a
(二)chown username[:groupname] file/dir
该指令用来改变一个文件或目录的组群和用户
eg:用户root创建了一个文件a,现在要将其组群改为swh1,用户改为swh2
chown swh2:swh1 a
(三)数字法改变操作权限
chmod xyz filename/dirname
其中:x/y/z=(r/-)+(w/-)+(x/-),
r:4 w:2 x:1 -:0
例如:将文件godisagirl的属性从-rwx------改为-rwxrwxr–
chmod 774 godisagirl
-
用途:拷贝文件给他人时需要将文件权限改变
- 注意:username须存在于/etc/passwd中,即必须是系统中的合法用户
(四)符号法改变操作权限
chmod [u/g/o/a][+/-/=][r/w/x],[u/g/o/a][+/-/=][r/w/x],… file/dir
u:拥有者 g:组群o:他人 a:所有人
+:加入属性 -:删除属性 =:设定属性
-
使用符号修改时,没有涉及到的项其属性不变
-
例1:目录权限修改练习(以root登录Linux)
-
cd /tmp
-
mkdir testing
-
chmod 744 testing
-
touch testing/testing
-
chmod 600 testing/testing
-
ls -al
-
su user
-
ls -l testing
-
exit
-
chown user testing
-
su user
-
cd testing
-
ls -l
-
rm testing
二、目录配置
Linux通用目录配置
-
根目录/
-
系统启动后载入的第一个分区,因此与启动有关的内容必须放在该目录中
- 系统启动后成为所有文件的总逻辑入口,该目录下不要创建文件
-
/bin、/usr/bin、/usr/local/bin
- 用户使用的可执行程序所在目录,如常用的用户指令等
-
/boot
- 引导和启动系统的文件,如系统内核、grub等
-
/dev
- 设备文件所在目录
-
/etc
- 系统主要的配置文件所在地,一般用户可看不可改,root可强改
-
/home
- 系统默认的普通用户家目录所在地
-
/lib、/usr/lib、/usr/local/lib
- 系统运行所需函数库所在
-
/mnt、/media
- 系统默认的软盘、U盘、光盘的挂载点,也可以用户自己设置
-
/opt
- 应用程序安装目录,某些人沿用旧系统的操作习惯,将应用程序安装在/usr/local目录中的指定文件夹中
-
/proc
- 虚假目录,放置内存中当前内容,是系统运行所需的当前数据,该目录本身并不占用外存空间
-
/root
- 超级用户root的家目录
-
/sbin、/usr/sbin、/usr/local/sbin(super bin)
- 超级用户可以使用的、用于系统运行和维护的可执行文件所在
-
/srv
- 系统服务所需的数据目录
-
/tmp
- 所有用户可用的临时文件夹
-
/usr
- 系统程序、X Window、附加函数库、用户应用程序、共享文件和目录等
-
/var
- 系统执行过程中经常变化的数据,如缓存、登录文件、数据库文件、队列文件等
-
***必须与根目录处于同分区的目录:/etc、/sbin、/bin、/dev、/lib等
***可与根目录处于不同分区的目录:/home、/usr、/var、/tmp 等
-
将某些目录与根分区分开,可以提高系统安全性和便利性
- 分区时经常划分为/、/boot、/usr、/home、/var
三、Linux文件与目录管理
(一) 关于目录操作的指令
-
cd:改变目录
-
pwd:显示当前所在的工作目录
-
mkdir:建立新目录
-
rmdir:删除空目录
-
-
pwd [-P]
- -P:用于显示真实路径,主要针对链接文件有效
-
用于显示当前所在的工作目录
- eg:cd /var/mail
pwd -P
-
mkdir [-mp] dirname
-
-m:将目录的操作权限设定为用户指定值
-
-p:建立指定位置处的目录,若目录层级不存在,就逐级创建
-
eg: mkdir testdir1
-
mkdir -m 744 testdir2
ls -l testdir1 testdir2 //观察目录操作权限
mkdir -p testdir31/testdir32/testdir33 //观察该指令执行前后的目录结构变化
-
rmdir [-p] dirname
-
-p:将指定目录及其上层的空目录一起删除
- 该指令只能删空目录,且当前目录不能删
-
eg: mkdir -p t1/t2/t3
-
mkdir t4
rmdir t4
rmdir t1;rmdir t1/t2 //观察目录删除提示
rmdir -p t1/t2/t3
(二)Linux文件与目录管理指令
ls:显示文件信息
-
cp:拷贝文件、目录
-
rm:删除文件、目录
-
mv:移动文件、目录
-
file:查看文件类型
-
touch: 新建文件和修改文件时间
-
-
ls [-adilSR] [filename/dirname]
-a:列出包含隐藏文件在内的所有文件(常用)
-d:仅显示目录本身属性信息,而非其子文件信息(常用)
-i:显示各文件的inode值
-l:以长格式列出文件的详细信息(常用)
-S(size)):以文件大小排序
-R:将子目录内容也列举出来
–full-time:显示文件最后一次被修改的完整时间
-
ls的默认操作对象为“当前目录”
-
某些系统中将最常用的ls -l指令设置为ll
-
cp [-drpasuf] 源文件 目标文件
-
cp [options] 源文件1 源文件2 源文件3 … 目标目录
源文件为被复制文件,可以为多个;目标文件为复制后的副本文件,若源文件有多个时,则目标文件必须为目录类型
-
-d:当源文件为链接文件时,加该参数仅复制快捷方式,不加该参数则复制源文件
-
-r:复制目录(常用)
-
-p:复制时保持文件属性,不使用默认属性(用于文件备份)
-
-a:使得目标文件的所有属性都与源文件相同,相当于选项组合-pdr
-
-s:生成源文件的符号链接文件,相当于“快捷方式”(软链接)
-
-u:通常目标文件已经存在,只有当源文件较新时才进行复制工作
-
-f:强制复制,可能会覆盖原有的同名文件(常用)
-
-
rm [-fir] filename
-f:强制删除,适用于确定无用的情况
-i:需要用户确认才可删除,通常是默认选项
-r:从指定目录递归向下查找并删除,直到将指定目录完全删除为止
- 例子:强制删除目录lyric
rm –rf /home/user/music/lyric
执行该行指令后,目录lyric将不会再询问而彻底删除
-
mv [-fiu] 源文件 目标文件
-
mv [options] 源文件1 源文件2 源文件3 … 目标目录
-u:当源文件比目标文件新时才移动
-f:强制移动
-i:移动前先询问是否动作
- 查看文件的类型,可以使用file指令,其格式为
file filename
-
文件的时间属性
-
Mtime(modify):修改时间,最近一次修改文件内容的时刻
-
Ctime(condition):状态时间,最近一次修改文件状态(即文件属性)的时刻
-
Atime(access):访问时间,最近一次被读取的时刻
-
-
touch [-acmt] filename
基本功能为将指定文件filename的atime和mtime设置为当前时间
-
-a:只重置访问时间atime
-
-m:只重置修改时间mtime
-
-c:只更新时间,不创建文件
-
-t: YYMMDDhhmm:将文件的atime和mtime设置为指定时间,而非当前时间
-
(三)查看文件内容的指令
-
查看文件内容的指令
-
cat/tac:从首行/尾行显示
-
more:分页显示
-
less:分页显示
-
nl:显示时添加行号
-
head:只显示文件头部
-
tail:只显示文件尾部
-
-
cat [-nvETA] filename
将指定文件从首行开始连续显示在屏幕,当文件过大时不适用(会快速刷屏,把前面的内容覆盖掉)
-
-n(line number):在每行的最前面显示行号
-
-v:强制将不打印的特殊字符显示出来
-
-E:将行尾的换行符以“$”显示
-
-T:将[Tab]以“^I”显示
-
-A:用于列出常见的特殊字符,作用等同于-vET
-
-
tac与cat用法相似,不同之处在于其从尾行显示
-
nl [-b a/t] [-w m] filename
在显示内容的同时加上行号
-b a :空行也加行号
-b t :空行不加行号
-w m :设定行号的位数
eg:显示文件内容,并为每行设定位数为3位的行号,空行也加行号
nl -b a -w 3 godisagirl
-
more filename
-
从第一页开始按页显示文件filename的内容
-
常用的操作
-
空格键:向下翻页,到最后一页时直接退出
-
回车键:向下一行
-
b:向上翻页
-
/word:寻找字符串word
-
q:退出more指令的操作界面,返回上层环境
-
-
-
less filename
分页显示指定文件filename的内容,使用相应按键实现上下翻页
-
空格键:向下翻页
-
PageDown/PageUp:向下/上翻页
-
/word:搜索字符串word(向下搜索)
-
?word:搜索字符串word(向上搜索)
-
q:退出less操作界面,返回上层环境
-
-
head [-n 行数] filename
显示文件的头部,默认显示10行
-
-n 行数:显示头部的指定行数内容
-
tail [-n 行数] filename
显示文件的尾部,默认显示10行
- -n 行数:显示尾部的指定行数内容
(四)文件的默认权限和特殊权限
-
文件的默认权限
-
Linux系统中,不同用户在创建文件和目录时可使用不同的默认权限,通过对其管理可以将用户的文件置于更佳的保护状态
- 基础默认权限为:文件为666,目录为777
-
查看默认权限
-
umask:用数值显示当前已经取消的权限
- 注意此处不能直接将基础默认权限“减去”umask显示的值,而应采用“与”运算
-
umask -S:用符号显示系统当前的默认权限
-
-
修改默认权限
- umask xyz:设置需要取消的权限值
-
文件特殊权限
-
s权限是为了让执行某些程序的用户可以临时具有文件拥有者的权限
-
s权限出现在x权限位置:若出现在user的x权限处,被称为SUID(set
UID);若出现在group的x权限处,被称为SGID(set GID) -
当其为小写时表示用户具有临时使用指定文件拥有者或所属群组用户权限的能力
-
当其为大写时表示虽然设置了s权限,但文件拥有者自身也不具有指定文件的相关权限,因此s权限实际为“空”
-
-
SUID只对“二进制文件”有效,且只在执行时有效
-
SGID对文件设置时表示执行程序的用户的有效组群临时变为该文件的组群;若SGID对目录设置,则表示用户在该目录下创建的子文件与该目录的所属组群相同
-
t权限(Sticky
Bit,SBit)只对目录设置,表示具有w和x权限的用户在该目录下所创建的文件只有文件拥有者和root有权进行删除、重命名、移动等操作 -
设置文件特殊权限
-
SUID为4,SGID为2,Sticky Bit为1
-
使用chmod指令,在原来的xyz之前加入一个n值,该值为SUID、SGID和SBit的组合
-
(五)文件搜索
-
查找文件或目录的指令
-
which:通过环境变量PATH查找可执行文件位置
-
locate:在数据库中查找指定文件
-
whereis:从数据库中查找特定文件
-
find:功能强大的搜索指令,但速度很慢,直接搜索硬盘
-
-
环境变量PATH的作用是提供给用户查找可执行文件的可能路径(关于PATH的作用:
PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径。比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根本不在这个两个目录下,事实上当你输入命令的时候LINUX会去/bin,/usr/bin,/sbin等目录下面去找你此时输入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒号使目录与目录之间隔开。)
-
当用户给定某个可执行文件的名称时,linux将自动搜索PATH中记录的多个目录,所找到的第一个能匹配的文件将被执行
- 当新安装了程序时,通常需要将该程序的可执行文件的绝对路径写入环境变量PATH
-
查看PATH
echo $PATH
-
修改PATH的值
- 将用户工作目录/home/swh/work加入PATH中
PATH=“$PATH”:/home/swh/work
- which [-a] filename
从环境变量PATH的指定路径中寻找可执行文件
-a:将所有可找到的可执行文件全部列出,而不是仅列出第一个
-
locate [-i] filename
-
根据数据库/var/lib/mlocate的记录搜索指定名称的文件或目录,只需要给出部分文件名
-
-i:忽略大小写
-
优点:搜索速度快
-
缺点:数据库不是最新时会影响搜索结果的正确性
- 更新数据库使用指令updatedb
-
-
whereis [-bsmu] filename
-
与locate基本一样,但可以给出更细致的查找要求,建议给出完整文件名
-
-b:只找二进制文件
-
-s:只找source 源文件
-
-m:只找说明文件manual
-
-u:非上述类型的其他特殊文件
-
-
find [路径] [选项组合] [操作]
-
根据指定条件搜索文件
-
直接使用find,不加任何参数时将当前目录下的文件和目录以及子目录中的文件名称显示出来
-
-
find 的时间选项
-
-atime n:在n天前的“一天之内”访问过的文件
-
-ctime n:在n天前的“一天之内”修改过状态的文件
-
-mtime n:在n天前的“一天之内”修改过内容的文件
-
-newer file:搜索比指定文件file新的文件,file必须是已经存在的文件
-
eg:find /var –atime 0
-
寻找从当前时刻往前的24小时内被访问过的文件
-
find 的用户相关选项
-
-uid n:指定路径中用户UID为n的文件
-
-gid n:指定路径中用户GID为n的文件
-
-user name:指定路径中用户名为name的文件
-
-group name:指定路径中群组名为name的文件
-
-nouser:查找拥有者为非法用户的文件
-
-nogroup:查找群组为非法用户的文件
-
-
find 的文件属性相关选项
-
-name filename:查找文件名为filename的文件
-
-size
[±]n:查找比n大(+)或小(-)的文件,n值的单位有c(byte)和k(KB) -
-type n:查找文件类型为n的文件,n值与ls
-l第一栏第一个字符的意义相通,只有常规文件的“-”变为“f” -
-perm mode:搜索文件权限为指定mode值的文件
-
这个mode值与chmod指令中的一样,如-rwsr–r--对应4744
-
mode前加+:寻找包含任一mode指定权限的文件(由于软件更新,这个命令现在已经不能用了)
-
mode前加-:寻找包含全部mode指定权限的文件
-
-
四、磁盘与文件系统管理
(一)文件系统的相关概念
-
inode
-
新建目录时,为其分配一个inode和一个block,前者放目录自身的属性,且指向后者;后者放与该目录有关的文件的关联性
- 目录的block保存的信息中最重要的是文件名指针,该指针包括文件名和指向文件inode的指针
-
新建文件时,为其分配一个inode和足够数量的block以“装下”该文件的全部内容,同时也要将该文件的文件名指针添加到其所在目录的block中
-
在linux中,使用指定路径读取文件内容时,首先由根目录开始获取其所在目录的inode,从中找到文件名指针,由此找到文件的inode,再由文件inode找到其起始block,最终得到block中所存储的文件内容
-
-
文件系统需要载入(mount)才能使用
-
物理存在的数据在逻辑上被组织为目录树的形式
-
在存储数据时,为了管理和读写方便,要求某个分区中的数据必须位于某个特殊目录之下,而这个目录下的所有数据所在的block也必须位于该分区,这个目录就被称为载入点或挂载点
-
eg:在安装linux时划分的/和/home就属于两个分区,使用ls -id /
/home指令可以看到这两个分区的inode编号都是2,这表明它们位于不同分区,且分别是本分区的载入点
-
-
查看指定文件或目录所在分区(文件系统)的容量信息及其使用情况
-
df [-ikmhaT] [dirname/filename]
-
-i:使用inode显示容量
-
-k:结果以KB形式显示容量
-
-m:结果以MB形式显示容量
-
-h:以日常通用的KB/MB/GB等显示容量
-
-a:显示当前操作系统中所有的文件系统(分区)的容量信息
-
-T:除显示磁盘容量信息外,还将该文件系统的类型同时给出
-
-
-
查看目录容量的指令
-
du [-akmh] dirname/filename
-
默认查看当前目录下所有的“目录”及这些目录下的文件的容量
-
-a:列出所有文件与目录的容量
-
-k:以KB显示结果
-
-m:以MB显示结果
-
-h:以常见的KB/MB/GB等显示容量
-
-s:列出指定目录或文件占用的总容量,不再列出其子目录容量
-
eg:查看指定目录下所有子目录的大小
-
-
du -sm dirpath/*
- ln [-sf] 源文件 目标文件
源文件为被链接的文件,目标文件为链接文件
-s: 加该选项时为创建软链接文件
若不加该选项则是创建硬链接文件
-f: 若指定的目标文件已存在,则将其覆盖
- ln -sf passwd passwd_sl
若文件passwd_sl(无论类型是什么)存在就覆盖它并创建同名的软链接文件
eg:cd /tmp
cp /etc/passwd .
du -s; df -i //查看容量信息
ln passwd passwd_hl //建立硬链接
du -s; df -i
ls -il passwd* //查看文件类型
ln -s passwd passwd_sl //建立软链接
du -s; df -i
ls -il passwd*
链接文件属性
- 连接数
新建常规文件:连接数为1,代表自身
新建目录文件:连接数为2,代表它本身与其
上层目录,同时其上层目录的
连接数加1
eg: cd /home/swh
ls -ld /home/swh
mkdir testdir2
ls -ld /home/swh /home/swh/testdir2
- 硬链接和软链接的文件类型不同
硬链接与源文件相同,软链接是l(链接文件)
硬链接是直接指向已存在的文件,其文件属性信息来自源文件的inode;软链接是一个符号,仅保存了从本文件到源文件的一个路径,其文件属性来自自身的inode
- 结论
-
硬链接的inode号和源文件一样,软链接不同
-
硬链接和软链接的文件类型不同
-
硬链接的大小和源文件相同,软链接仅仅几个字节
- 硬链接的限制
- 不能跨文件系统、跨分区链接文件
硬链接直接指向原文件的inode
,其数据结构与具体文件系统相关联,因此不可跨系统创建硬链接文件
软链接仅保存了原文件的路径,因此可以实现跨文件系统链接
eg: 若/home/swh与/处于不同的分区,则不可将二者的文件相互硬链接
- 硬链接的限制
- 不能链接目录
硬链接到目录时要求该目录下的所有文件都要同时建立硬链接,且在该目录下新建文件时也要这样做,容易出现错误,同时大大增加系统复杂性
- 删除源文件时硬链接与软链接反应不同
硬链接文件“忘记”自己是链接文件,变为一个常规文件
软链接文件会产生“断链”现象,无法正常显示
- 硬链接与复制文件的不同
硬链接不占用空间,修改硬链接文件时源文件跟着改变
复制文件占用空间,对它的修改不会影响源文件
eg:
将处于目录树深层的文件提升上来,使用硬链接;修改某些配置文件(.bash_profile),用复制文件
文件系统挂载
磁盘分区指令:
fdisk [-l] devname
查询和修改分区表,并未真的对分区格式化
-l:列出指定硬盘的分区表
注意:
对硬盘分区时,设备名称后不加数字,即对硬盘分区,对分区不可再分区
只有root有权执行,最好在单人模式下操作
正在使用的硬盘若无法顺利加载分区表,则需要先卸载正在使用的分区,然后重新进入fdisk界面重写分区表
用fdisk新建分区
fdisk /dev/sdb:进入fdisk分区工具的操作界面
n:新建分区,此时会询问用户创建何种类型的分区
p、e、l:指定建立主分区、扩展分区或逻辑分区
1-4:选择了分区类型后要求指定分区号,选择未用的号码,接着分别输入新建分区的初始磁柱号和终止磁柱号
q:不保存刚才的操作指令,退出
w:将输入的操作指令执行,修改分区表并退出
(请确定可修改后再执行,避免再次重装或重启系统!)
用fdisk删除分区
fdisk /dev/sdb:进入fdisk分区工具的操作界面,此时输入m可以查看指令列表
p:显示当前分区表
d:输入该指令后会要求指定要删除的分区号
q:不保存操作指令,退出
w:将输入的操作指令执行,修改分区表并退出
(请确定可修改后再执行,避免再次重装或重启系统! )
格式化:将一个分区制作为所需的fs
mkfs [-t 文件系统类型] 分区名称
-t fstype:将指定分区格式化为fstype类型
注意此处应写分区名称,而非硬盘名称
mke2fs [-b 块大小] [-i inode容量] devname
mke2fs [-c/L/j] devname
-b:设定块大小,默认为4K
-i:设定inode容量
-c:检查分区错误,-c快速测试,-c -c读写测试(慢)
-L:设定卷标
-j:将分区格式化为etx3文件系统,不加则为ext2
-t fstype:将指定分区格式化为fstype类型
检查磁盘:
fsck [-aCf] devname
执行时务必确保被检查分区没有挂载,避免分区中文件被修改后不能使用
-a:自动修复坏轨,不再询问
-C:使用条形图表示进度
-f:强制检查
只有root可以使用fsck指令
文件系统出现问题时使用
不正常的关机造成linux开机失败时使用
进入单人单机模式执行fsck -a /dev/sda1,然后reboot
挂载硬盘:
挂载点:本质上是一个目录,该目录下的所有内容均位于同一个分区上,则称该目录为这个分区的挂载点
对于某个分区而言,其挂载点就是访问该分区的入口
挂载了新分区后,将暂时隐藏原目录内容;分区卸载后,原内容可以继续使用
mount [-atLo] 设备名 挂载点
只有root可执行该指令
mount -t type /dev/hdxn /mountpoint
a:按照/etc/fstab中的内容挂载所有分区
t:按照其后的文件系统类型挂载分区,不加则按照上述文件挂载
L:根据卷标挂载系统
mount不加任何option:输出系统中所有已挂载的分区
挂载指定分区
将设备sda3以ext3文件系统挂载到/mnt, 这里的/mnt是linux的公共挂载点
mount -t ext3 /dev/sda3 /mnt
卸载指令:
umount [-f] [device|mountpoint]
eg: mount -t iso9660 /dev/hdd /mnt/cdrom
umount /mnt/cdrom
挂载U盘:
vm下挂载U盘:将鼠标点到linux的操作界面再插U盘,看到显示了vmware
usb设备的提示信息后,进行下面的操作
fdisk -l:列出目前挂载的所有分区,寻找新增加的分区
mkdir /mnt/usb:在linux系统中建立挂载点
mount -t vfat /dev/sdb1 /mnt/usb:挂载U盘
硬件法
在系统中新增一块硬盘
使用fdisk /dev/hd[a-d]在新硬盘上划分出来一个分区,并将其ID改为82
使用mkswap /dev/hd[a-d][1-16]将新增的分区格式化为swap格式
使用swapon /dev/hd[a-d][1-16]启动该swap分区
不用时执行swapoff关闭该分区即可
软件法
使用dd if=/dev/zero of=/tmp/swap bs=4k count=1024在当前/tmp中新建一个文件swap
使用mkswap /tmp/swap将文件/tmp/swap格式化为swap格式
使用swapon
/tmp/swap启动该swap文件(在执行此步骤前后分别执行一次free指令,观察swap大小的变化)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrVggxJz-1603540565793)(media/ffeab63b8b3dde87c8c38df77e2ef5df.png)]
不用时执行swapoff关闭该文件即可
六、Vim编辑器(重要!!!)
(一)、Vim的三种模式
- 、Vim练级攻略
Survive(存活)
Feel comfortable(感觉良好)
Feel Better,Stronger,Faster(更好,更强,更快)
Use Superpowers of vim(使用vim超能力)
Normal模式下的幸存方法
i进入Insert模式,使用ESC键返回Normal模式
x删除当前光标所在处的一个字符
dd删除当前行
p粘贴
:wq保存+退出(:w
保存,:q退出,使用w命令时可以在后面加上文件路径名,表示保存到该文件)
初级小强:
hjkl等同于←↓↑→的作用
:help <command>获取指定命令command的帮助信息,若不加就获取全部帮助
提醒:在Normal模式下,所有的按键均用于功能选择
Normal模式下的常用命令(转为编辑模式)
i/I:插入(insert)
a/A:添加
o/O:插入一行
r/R:替换,区别在于r仅替换一个字符,R一直替换到按下Esc才停止
Esc:退出,回到一般模式
Normal模式下的常用命令(光标移动)
ctrl + f/b:向后/前翻一页
n<空格>: 向右移动n个字符
0:移动到行首
$:移动到行尾
^:到本行第一个非blank字符(空格、Tab、换行、回车等字符)
g_:到本行最后一个非blank字符
n<回车>:向下移动n行
H/L:移动到当前屏幕的第一行/最后一行
Normal模式下的常用命令(查找替换)
/word: 在当前光标后查找含word的字符串
:n1,n2s/word1/word2/g:将n1行到n2行之间的word1替换为word2
:1,$s/word1/word2/g:将全文中的word1替换为word2
:1,$s/word1/word2/gc:与上个命令相同,但需要用户确认替换
Normal模式下的常用命令(复制粘贴)
yy:复制当前行
p:粘贴在当前位置之后
P:粘贴在当前位置之前
Normal模式下的常用命令(撤销/重做)
u:撤销(undo)
Ctrl+r:重做(redo)//此处的重做并非指,还原一切修改重做。而是指重复上次操作。Redo=do
again
Normal模式下的常用命令(打开/保存/退出文件和)
:e <文件路径> 打开一个文件
:w <文件路径> 按指定位置保存文件,默认保存到当前
:saveas <文件路径> 另存为指定文件
:wq 保存并退出
:qa! 强制退出所有正在编辑的文件
:set nu:显示行号
:set nonu:取消行号
:e!:将文件还原为最初的状态
:!command:临时执行一条shell指令
Feel better, Stronger,Faster
Better – vim如何重复自己
. (这是一个点,别看漏了)重复上一次的命令
N<command> 重复执行N次command命令
Eg:2dd(删除当前行向下的2行)
3p (粘贴文本3次)
10iswh(插入10次swh)
.(这是一个点,别看漏了)(重复上一个命令,本例中为插入10次swh)
3.(这是一个点,别看漏了)(重复3次“swh”,而不是30次)
Stronger – 光标移动更有效率
NG 到第N行,也可以使用“:N”
Gg 到第1行,相当于1G或 :1
G 到最后一行
按单词移动(注意大小写的不同)(注意断句)易混!!!
w到下一个单词的开头 =
到下一个开头,而非到下一个单词,然后到单词的开头(此处的单词由字母、数字和下划线组成,如变量)
e 到下一个单词的结尾 =
到下一个结尾,而非到下一个单词,然后到单词的结尾(此处的单词由字母、数字和下划线组成,如变量)
W 到下一个单词的开头 = 到下一个单词,然后到单词的开头
(此处的单词由blank字符分隔的“单词”,如程序语句)
E 到下一个单词的结尾 = 到下一个单词,然后到单词的结尾
(此处的单词由blank字符分隔的“单词”,如程序语句)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzZqTf23-1603540565801)(media/9104f7e2947cc4e2ea4fdf81abcea35b.png)]
注意:1,注意上述的单词不同于日常理解的单词
2,还要注意断句
Stronger – 中级小强
% 移动到匹配括号,包括(、[、{(注意:要先将光标移动到括号上)
*和# 移动到下一个(*)或上一个(#)与当前光标所在单词匹配的单词
Faster – 命令联动
<起始位置><command><终止位置>
表示从起始位置到终止位置处执行指定的命令command
Eg1:0y$中,0表示从行首开始,y表示复制操作,$表示到行尾结束,综合起来的意思表示复制当前行
Eg2:ye表示从当前位置复制到本单词的最后一个字符
当前行内的移动 —— 超级小强
0 到行首
^ 到本行第一个非blank字符
$ 到行尾
g_ 到本行最后一个非blank字符
fa 到下一个为a的字符处,也可以用fc找到下一个字符c
t, 到逗号前的第一个字符,逗号也可以换成其他字符
3fa 在当前行查找第三个a
F和T 作用同f和t,只是查找方向相反
dt” 删除下一个双引号前的所有内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcUNhonM-1603540565804)(media/d5bed8aef7017e87f625287277a7f1bd.png)]
Vim拓展功能:
多文件编辑
通常用于将一个文件的部分内容复制到另一个文件去时或需要多文件内容相互对照的情况下
vi 文件名1 文件名2 ……
:n表示查看或编辑下一个文件
:N表示查看或编辑上一个文件
:files显示当前打开的所有文件的编号
多窗口变换
vi在字符界面下的一种特殊应用形式,表现为在一个终端上同时显示两个文件或同时显示一个文件的不同段落,为用户查看资料、编写程序提供了便利
:sp [filename]
ctrl+w, j/k表示下/上移一个窗口
ctrl+w, q表示退出
七、压缩指令
Linux下常见压缩文件后缀
.Z:compress压缩的文件(已经被gzip取代)
.gz:gzip压缩的文件
.bz2:bzip2压缩的文件
.tar:tar打包的文件,没有压缩
.tar.gz:gzip压缩过的tar文件
.tar.bz2:bzip2压缩过的tar文件
压缩指令:
gzip指令是压缩解压指令,压缩后的后缀名为.gz,是当前网络上十分流行的压缩包形式,甚至可以在Windows下被WinRAR解压
gzip [-crd#] filename
-d:解压缩参数
-v:将压缩过程显示到屏幕上
-r:对文件夹内文件执行指定操作
-#:压缩等级(可选1到9级,6默认)
zcat filename.gz
在不解压的前提下读取.gz包内的内容
eg:zcat swhwork.gz
bzip2 [-dzc] filename
-d:解压缩
-z:强制压缩文件
-c:将压缩结果显示到屏幕去
-#:#代表1到9,即压缩级别,1最快但压缩比差,9压缩慢但压缩比较好
该指令产生的压缩文件后缀为.bz2
tar指令是目前功能较为强大的压缩指令,是用来将文件存储到归档文件或从归档文件中获取原文件的指
tar [-zjxvctpPNC] [-N `yyyy/mdd`] [–exclude=file] -f tarfilename source
-z:使用gzip工具
-j:使用bzip2工具
-x:解包文件
-c:打包文件
-t:查看.tar包中的文件列表
-v:显示操作过程
-f:后接压缩包名
-p:打包时不改变文件属性与权限
-P:按照source的绝对路径方式打包文件
-C:后跟目录名,要求解压时将压缩包内的文件放入该目录
-N:比yyyy/mm/dd更晚的文件才会打包压缩
–exclude=file:压缩过程中不打包名称为file的文件
eg:tar -cvf song.tar song 只打包不压缩
tar -cvzf song.tar.gz song 打包并压缩
tar -cvzPf song.tar.gz /home/swh/song
按照文件的绝对路径打包压缩文件
tar -zxvf home.tar.gz godisagirl –C /tmp
只解压home.tar.gz包中的godisagirl文件,且放置于/tmp目录
tar –zcvpf home.tar.gz /home
将/home压缩且不改变文件属性
eg:tar -N “2013/10/18” -zcvf song.tar song
当song晚于2013年10月18日修改才对其压缩
tar --exclude=/home/swh/song/lyric -zcvf song.tar.gz /home/swh/song
将song目录中除lyric外的文件打包并压缩
tar -ztvf home.tar.gz
查看home.tar.gz中的文件列表
备份指令:
dd if=inputfile of=outfile bs=blocksize count=number
if:输入文件或设备
of:输出文件或设备
bs:设定outfile文件的块大小,默认为一个扇区512B
count:outfile占用的块数
eg:dd if=/dev/hda of=/tmp/mbr.bak bs=512 count=1
将硬盘had的MBR记录下来
eg:dd if=/dev/hda1 of=/home/hda1.bak
备份分区hda1为hda1.bak,需要恢复时将if和of反过来即可
软件包管理
检测程序:
config或configure
用于检测软件编译运行环境,主要包括
是否有能编译本软件的编译程序
是否安装了本软件的前导软件或依赖软件
操作系统是否能支持本软件
内核头文件是否存在(驱动程序必须的检测)
该程序完成后将生成Makefile或makefile文件,其中有源码的编译步骤和规则
make指令按照makefile(或者Makefile)文件的记录对源码进行编译
make可以检查源码是否有变化,并自动更新可执行文件
gcc(GNU编译器软件,GNU Compiler Collection)
支持C、C++、Objective-C、Fortran、Java、Ada和Go等语言,甚至多种汇编语言
用法
gcc filename //将名为filename的文件编译为可执行文件a.out
gcc -o efile sfile //将名为sfile的源文件编译为可执行文件efile
gcc -o efile sfile -Wall //编译过程更严谨,会将警告信息也显示出来
gcc -c sfile
//将名为sfile的文件编译为目标文件(通常为.o后缀),不链接为可执行文件
Tarball的常规安装流程
下载源码Tarball:建议放到/usr/local/src
解压Tarball,释放大量源码文件
根据INSTALL/README文件检查和安装前导软件
生成makefile:执行config或configure自检环境,生成文件makefile
编译:根据makefile进行参数配置,执行make程序进行编译,生成安装程序install
安装:按照makefile的要求,利用make执行install程序,将软件安装到系统中
账号与身份管理
用户分类:
超级用户
即系统管理员,具有普通用户所不具有的系统维护和管理职能
UID为0
一个系统中超级用户可以有多个,但建议不要设置多个
普通用户
可以执行权限范围内的工作,获得一定的信息
普通用户在自己的家目录中具有较高的控制权限
用户账号文件:
linux中进行账号管理的文件主要有/etc/passwd和/etc/shadow
/etc/passwd中每行代表一个账号的常规信息,每行7栏组成
账号名称
密码:真正的密文在shadow中,此处只有一个x表示有密码
UID:0为超级用户、1~99为系统预留账号、100~499为系统服务账号、500~232-1为一般用户
GID:组群标识符
用户信息说明:可用来写用户的个人信息
用户家目录
Shell
linux中进行账号管理的文件主要有/etc/passwd和/etc/shadow
/etc/shadow文件中也是每行一个账号,由9栏组成
账号名称:用户的唯一符号名称,与passwd对应
密码:经过MD5加密的真正密文
最近修改密码的日期:从1970/01/01计数
密码不可变更天数:为0表示随时可更改
密码有效期:需要重新更改的天数,若不在该时间期限内修改密码,则密码会暂时失效,若时间为99999则表示无需修改密码
密码警告期:更改期限前的警告期限,即在密码暂时失效前多少天给用户失效提示
账号宽限期:密码过期的宽限时间,即密码有效期后使用原密码仍可登录,但若用户一直不更改密码,过了宽限天数后将使该密码失效
账号失效期:到该指定日期后密码不可再用
保留字段:用于未来功能扩展
/etc/group与/etc/gshadow文件
group中记录了组群与用户账号的对应,每行由组群名称、组群密码、GID和组成员列表四栏组成
gshadow文件中记录了组群账号、组群密码、组群管理员密码和组群成员列表
有效组群与初始组群
初始组群:用户“生来”所在的组群,记录在/etc/passwd的第四栏中,无需记录在/etc/group的第四栏
有效组群:用户执行当前指令时所在的组群
组群账号切换
使用groups可以查看用户当前所属组群
第一个组群为该用户的有效组群
使用newgrp groupname可以将用户的有效组群切换为groupname
newgrp使用新shell登录并切换有效组群,可以使用exit指令退出shell并返回未切换前的shell,此时的有效组群自然也恢复原值
若文件/etc/gshadow没有与group的成员栏不一致时,newgrp可能无法执行
组群账号切换
eg:如用户swh的初始组群为swh,另外还是组群user的成员,执行下列指令,观察返回信息
groups
newgrp user
groups
exit
groups
账号管理
新增用户:useradd
删除用户:userdel
修改用户:usermod
新增用户
useradd [-u UID] [-g GID] [-G GID] [-Mm] [-d HOME] [-s shell] [-r] username
-u :增加用户时直接为其指定一个特定的 UID
-g :后接初始组群的GID
-G:后接其他组群的GID
-M:强制不建立用户家目录
-m:强制建立用户家目录
-d :指定某目录为用户家目录,而不使用预设值
-s :后接 shell ,默认为/bin/bash
-r:创建一个系统账号,通常会使用100以后的UID和GID
新增用户
eg1:useradd –r sysuser
grep sysuser /etc/passwd /etc/shadow /etc/group /etc/gshadow
eg2:useradd sunhouzi
grep sunhouzi shadow passwd group
eg3:useradd -d /home/xiyouji/ts –u 600 -g sunhouzi tangseng
删除用户
userdel [-r] username
-r :删除用户的同时也删除其家目录
修改用户属性
usermod [-degGlsuLU] username
-d :后接用户家目录
-e :账号失效时间,格式是 YYYY-MM-DD
-g:后接组群名,用于修改/etc/passwd的第四个字段
-G:后接组群名,用于修改/etc/group的第四栏
-l :后接账号名,用来修改账号名称
-u :后接 UID
-L :在用户密文前加上一个!,暂时冻结用户密码
-U :将 /etc/shadow 密码栏的 ! 去掉
密码管理
设置不易破解的密码
root可以设置所有账号的密码,user只能设置自己的
所有的用户在修改自己的密码时,只需直接输入passwd即可
root具有使用passwd user将user的密码改变的权限
密码管理
passwd [-lu] username
-l:将用户username的密码锁定
-u:将用户username的密码解锁
组群账号管理
新增组群:groupadd
删除组群: groupdel
修改组群: groupmod
加密组群: gpasswd
groupadd [-g GID] groupname
新增名为groupname的组群
-g :直接为新建组群指定GID
groupdel groupname
删除名为groupname的组群
删除时要求该组群没有成员用户
修改组群
groupmod [-g GID] [-n new_groupname]
groupname
-g :修改GID值(慎用)
-n :修改组群名称
加密组群
gpasswd groupname
为组群加一个密码
gpasswd [-A user1] [-M user3, user4…] groupname
将组群管理员设为user1,组群成员为user3, user4…
gpasswd [-r] groupname
删除组群密码
用户身份切换
避免无心之失对系统造成的损害
用低权限启动系统,减小入侵损害
软件的限制
转换身份指令
su:将user转成root,需要root密码
sudo:不需要root密码,仅以当前普通用户密码执行一次root权限指令
转换身份指令
su [- lcm] [username]
- :将当前用户转换为root,且使用root的环境设置
-l :将当前用户转换为username,同时使用其相关环境设置
-m :使用当前用户的环境设置值
-c :将后接指令执行一次
eg: su - -c “ls -al"
转换身份指令
sudo [-u username] command
-u: 将当前用户的身份转为username并执行command指令
只有在/etc/sudoers中设定过的用户可以通过sudo指令变换为root
系统用户查询
who:查询所有已登录用户
whoami:查询当前登录用户
last:查询系统记录的用户登录信息
lastlog:查询用户登录终端和最后登录时间
十、Shell简介
知识点
OS的作用
一般用户角度
人机接口
资源管理角度
系统资源的管理者
软硬件体系结构角度
裸机之上的第一层软件
OS的作用
扩充机器
裸机:物理的机器,没有安装任何软件
虚拟机:覆盖了软件的机器
Linux的组成
Linux的组成
内核:
内存管理、外存(文件)管理、设备管理、CPU管理
GNU工具
核心GNU实用程序,用于处理文件、操作文本、管理进程
shell
窗口管理程序
X
Window图形用户接口:Unix和Linux系统的图形化用户界面标准协议,用于显示图形,不限制显示和控制风格
KDE或GNOME桌面:展现于用户面前的桌面显示和控制手段
shell
shell是内核kernel的“壳” ,是用来将机器语言和人类语言相互转化而存在的软件层次
由于kernel指令具有复杂性、高技术性、关键性等特点,shell也用来屏蔽内核的复杂性以及防止用户误操作对系统内核造成不良影响
是命令语言、命令解释程序及程序设计语言的统称
它的作用是控制内核为用户工作
为用户提供启动程序、管理文件和进程的交互式方式
shell
广义上讲,linux的shell包括KDE、Gnome等桌面程序;狭义而言,shell并不包括这些桌面操作环境
在Unix和类Unix操作系统世界中,有三种独立开发的shell十分流行,它们分别是Bourne
shell、Korn shell和C shell
在linux中,默认的shell为Bash,即Bourne again
shell。它是GNU计划中一个重要的工具软件,也是目前GNU操作系统中的标准shell
shell
cat /etc/shells
/bin/sh(最初的shell版本,目前已经被bash取代)
/bin/bash(linux的默认shell)
/bin/ksh(Korn shell,与bash兼容)
/bin/csh(已经被tcsh取代)
/bin/tcsh(整合了C shell,提供更多的功能)
知识点
shell
不同shell的本质都是为了给用户提供一个在linux下操作的便捷而安全的界面。为了达到这个目标,每个shell都提供了基本的功能,它们包括:
shell
环境控制
启动文件:当用户登录系统时,首先执行系统启动文件来对shell和其他工具所需的环境变量进行初始化设置,接着根据默认或指定shell寻找shell启动文件,其用以配置用户的安全操作设置
环境变量:定制操作环境的设置性信息
shell
环境控制
从shell的角度来看多用户问题:
1、当用户登录系统时,相应启动文件被执行
2、调用一个子shell对该用户的操作环境进行设置,其中包括用户的home目录、使用的终端类型以及用来搜索可执行文件的路径等
3、上述配置信息被存储在环境变量中,通过对这些环境变量的管理来实现环境设置与控制
shell
环境控制
eg:对PATH的设置可以影响当前登录用户的指令执行效果
shell
命令行解释
用户登录linux后启动一个交互式shell。当用户在shell提示符(
#、$或者%)后输入一行如下格式的指令后,shell就会试着解释它
command [-option] [filename]
shell
命令行解释
eg: [root@localhost swh]# ls -l file1
主机名为localhost的机器上当前用户为root,当前目录为swh,ls是指令文件,-l是选项,file1是指定查看的文件名。这些显示结果都是shell将机器语言和人类语言互译的结果
shell
启动指定程序
在完成命令行的解释后,shell就指挥内核从PATH环境变量指定的目录或用户指定目录中搜索命令行中要求调用的可执行文件
所谓shell启动指定程序,本质上仍然是由内核来执行
shell
启动指定程序
当shell找到指定文件后,就启动一个子shell来运行程序
子shell由其父shell启动,在不影响其父shell的前提下建立和控制它自己的环境
eg:一个子shell可以将其自己的工作目录设置的与父shell不同,当它运行结束并关闭后,其父shell的工作目录仍保持不变
shell
输入输出重定向
输出重定向:将指定的输出信息发送到除屏幕外的其他地方去,例如一个指定的文件等
输入重定向:指令所处理的数据并非来自通常位置(如键盘),而是来自指定的文件或其他指令等处
在执行程序前进行输入输出重定向的编译
shell
管道连接
输入输出重定向的特例,它是将前一个指令的输出数据直接作为后一个指令的输入数据
管道也是在调用程序前建立的
eg: who | wc -l
wc是一个用来显示文件容量参数的指令,shell将who指令的输出结果作为wc指令的输入数据,而不是将其显示在计算机的屏幕上
shell
文件名置换
使用较少的字符取代多个字符
eg:ls -al pass*
这里的星号是一个多字符的替代符号,可以取代一串字符
在程序执行以前完成文件名替换
shell
变量维护
变量就是存储数据为将来所用的场所
用等号(=)可以给变量赋值
eg: ]$ LOOKUP=/home/swh
]$ echo $LOOKUP
/home/swh
]$ echo LOOKUP
LOOKUP
shell
变量维护
变量置换在调用程序前完成,替换时用变量值取代变量名
eg: ]$ls -l $LOOKUP/hustle
在执行ls指令前将LOOKUP变量置换为/home/swh,即显示/home/swh/hustle文件的相关信息
shell
Shell编程
shell还可以被视为一种集成化开发管理手段。通过使用流程控制和条件判断来组合指令以及对变量赋值,用户就拥有了一个有力的编程工具
使用shell作为开发环境有许多好处,例如使重复的任务自动执行、写报告、回复邮件等等
学习shell的意义
避免设置上的麻烦
可直接从底层开始设置,比图像化设置程序的功能更直接有效,且不受软件差异的限制
远程管理时效率更高
保证快速的传输速度
不易断线以及减少信息泄漏可能性
加深对操作系统运作机制的理解
知识点
Bash
多数Linux版本的默认shell
是GNU计划中最重要的工具软件之一
优点
强大的命令记忆能力
指令与文件名补全功能
指令别名
前后台处理
shell scripts的指令程序功能
Bash的优点
命令记忆
使用cat /root/.bash_history可以查询本次登录前曾经做过的指令
本次登录以来的指令存储在内存中,注销系统时才会回填到.bash_history中
使用上下键就可以实现上次/下次指令间的切换
用于监测是否有用户非法入侵或非法操作
Bash的优点
补全功能
Bash可以自动补全文件名或者指令
输入文件或指令的开始字符串,再点击Tab键实现自动补全
一次Tab:自动补全
两次Tab:显示所有可用的以指定字符串开头的文件或指令
Bash的优点
指令别名
指令的“外号”
可以使用指令本身或者它的别名来调用指令
eg1:]$ alias
alias vi=‘vim’
]$ vi aa
]$ vim aa
eg2: ]$ alias cls=‘clear’
Bash的优点
前后台控制
使用后台控制可以将当前的工作放到后台执行,也就是说执行过程或结果不再显示在屏幕上,而是在系统中默默的运行着
将工作放在后台可以避免误操作中止进程,当工作完成再将其调到前台查看结果
便于用户在单用户环境中实现多任务同时处理
Bash的优点
shell scripts的指令程序功能
shell scripts与用户交互式的进行交流并检测主机
用户可以将一串连续的指令写入文件中去,在需要的时候直接调用该文件来完成指令的执行
在某些情况下,用户所编写的shell scripts就像一个小型程序一样,便于执行与改写
十一、Shell指令(一)
知识点
变量
存储数据以备未来所用的场所
以文字或字符表示的参数或设置
便于参数修改与维护,减少编译的需求
变量设置规则
格式:变量名=变量值(这点与具体的shell版本有关)
等号两边不能加空格(在bash中)
变量名只能是字母或数字,且首字符不能是数字
单个特殊字符可用转义符号 “\”变为一般符号,转义符号与该特殊字符间无其他字符
变量设置规则
当需要显示的内容包含空格等特殊符号(元字符metacharatar)时,使用双引号或单引号将其组合在一起
双引号有变量代换功能:当双引号中的字符串出现了变量名时,系统自动将变量值作为字符串的一部分看待
注意:在双引号中,除“$”外还有“\”和“`”保留原来的元字符功能
单引号不具有变量代换功能
eg: ]# name=swh
]# echo ‘$name is my name’
]# echo “$name is my name”
变量设置规则
使用反引号“ `COMMAND` ”或“$(COMMAND)”实现指令的嵌套
优先处理反引号内的指令,反馈结果被视为外层指令的一部分
eg: ]# ls –al `echo $workdir`/testdir
该指令相当于ls -al /home/swh/testdir
eg: ]# cd /lib/modules/$(uname –r)/kernel
将uname
–r作为内嵌指令可以将本系统的版本名提取出来作为外层指令的一部分,既保证了通用性又节省了时间
变量设置规则
增加变量内容时,使用双引号及$变量名称累加
eg: MAIL=“$MAIL”:/home/swh/mailbox
命名规范:大写变量名通常为系统预设,用户自定义变量通常用小写
使用变量传递指令export将变量设置为向下传递的系统环境变量,扩大使用范围
取消变量:unset paraname
查看变量值
echo $varname
查看指定变量varname的值
eg:echo $PATH
echo $MAIL
若echo指令后不加$则直接显示其后所接的字符串
查看变量值
env
该指令用来查看系统默认环境变量的值,其中比较重要的有:
HISTSIZE=1000
.bash_history中记录的指令条数
HOSTNAME=localhost.localdomain
主机名
查看变量值
LANG=zh_CN.UTF-8
语言类型
USER=root
当前登录用户的账号
MAIL=/var/spool/mail/root
邮件的存取地址
PWD=……
当前工作目录
查看变量值
HOME=/root
当前用户的家目录
SHELL=/bin/bash
默认的登录shell类型
TERM=linux
默认的终端类型
PATH=……
系统可执行文件的默认查找路径
查看变量值
set
查看当前用户的所有变量,包括环境变量和用户自定义变量
环境变量可以被子shell继承,自定义变量不能
eg: ]# set
]# workdir=/home/swh/
]# set
可以看到新定义的这个workdir变量已经记录在系统中了
变量传递指令
export para
将指定变量para变量设置为可向子shell传递的变量
从shell角度看,变量para处于本shell中,使用该指令将其向下传递后,每启动一个新的子shell,这个变量都将被读入,设置为新shell的环境变量
从程序角度看,被传递的变量是全局变量,未传递的变量是局部变量
这样做可以保证变量para在后续的操作中继续使用,避免重复设置
变量配置指令source
source filename
将修改后的配置文件filename应用在当前环境中
eg: 修改环境变量PATH,并使其立即作用于当前环境
cd /home/swh
cp .profile profile.old
vim .profile //代表隐藏文件的“.”必须加
加入或修改路径后退出vi
source .profile
变量传递指令
test2=11 为变量test2赋值为11
bash 启动一个子shell,注意这里test2并不是全局性的
echo $test2 显示变量test2的值,这里不会显示,因为test2是局部变量
exit 退出当前shell,回到父shell
export test2 声明变量test2为全局变量
bash 启动一个新的子shell
echo $test2 显示test2的值,这里的结果将反馈为11
exit 退出当前shell
export 显示当前所有的变量,和set的操作结果类似
取消变量指令
unset para
取消para变量的设置内容
变量设置例题
eg1:按照要求写出指令以及操作结果
将变量test1赋值为swh’s test1
test1=“swh’s test1” 操作成功,注意等号前后没有空格
查看操作是否成功
echo $? 若反馈为0表示成功,反馈为其他的数值表示失败
将变量2test赋值为swh’s test2
2test=swh’s test2 错误,因为不能用数字作为变量名的开端
查看变量test1的值
echo $test1或者echo “$test1”或者echo ${test1}
变量设置例题
eg2:请说出下述指令的作用及操作结果
name1=moon river
错误,空格是特殊字符,需要进行组合或者转义
echo $name1
显示name1的变量值
name2=“moon river”
echo $name2
name3=’moon river’
变量设置例题
echo $name2johnny
没有结果可以显示,因为此变量不存在
echo “$name2”johnny
显示moon riverjohnny,进行了变量代换
echo ${name2}johnny
和上面的一样
name4=$name2johnny
赋值不成功,因为$是特殊字符
变量设置例题
name5=”$name1”johnny
赋值成功,所赋的值为moon riverjohnny
name6=${name1}johnny
和上面的指令结果一样
name2=“$name2”“ mercer”
为name2追加“ mercer”
变量声明
bash使用弱类型变量,默认使用字符串类型,但某些场合需要其他类型的变量,此时应显式声明变量类型
vim
[-aixr] para
a:声明变量para为数组型
i:声明变量para为整型
x:声明变量para向下传递,等价于export
r:声明变量para为只读,该类型变量不能重置
变量声明
没有声明sum为整型变量前,3+8*3被作为字符串赋值给sum,声明为整型变量后则将其运算后,结果赋值给sum
知识点
指令别名
格式:alias usrcmd=`command`
该指令将command指令置换为usrcmd,当用户使用usrcmd时,其功效等同于command
简化指令,使其更符合自己的操作习惯
查看当前已设置的别名可直接使用alias
临时“挂起”某个别名可通过在别名前加“\”实现
取消别名:unalias usrcmd
指令别名
与变量的区别:
指令别名用于设置指令的简称,可以视为普通的指令使用,本质上属于可执行文件,查看时使用alias指令
变量是指代具体数值或字符,它将在指令或文件中被使用,不能直接执行,使用用env、set等查看
历史指令
history
可以查看的历史指令包括本次登录以来的指令以及以往登录时使用过的指令
eg:history 显示历史指令
!! 执行上个指令
!22 执行文件~/.bash_history中记载的第22号指令
!vi 执行上一个以vi开头的指令
输入输出重定向
标准文件
每条命令执行时,内核自动为其打开的三个标准文件,分别是命令的输入、输出和错误信息文件,称为标准输入(stdin)、标准正确输出(stdout)、标准错误输出(stderr)
输入输出重定向
将指令的输入输出数据流导向非默认地点
三种输入输出状态的表示
标准输入:<,stdin,代码0
标准输出:1>,stdout,代码1
错误输出:2>,stderr,代码2
输入输出重定向
指令格式
command > dev/file
command 2> dev/file
command >> dev/file
command 2>> dev/file
command < dev/file
输入输出重定向
标准输入
<:指令的输入数据不是从键盘等默认位置输入的,而是从指定的文件中来的
输入输出重定向
eg1:在linux中手动发送邮件的步骤为:
mail -s ‘lucky’ swh
输入邮件内容
. 这个.说明结束了邮件的输入
eg2:若使用输入输出重定向,只要输入指令
mail -s ‘lucky’ swh</home/swh/mailfile
其中,mailfile是事先写好的文件
输入输出重定向
标准输出
>:将输出结果转到某个指定的文件中去,当该文件不存在时就创建一个新的,当该文件存在时就覆盖其旧有内容,因此在使用时一定要先查看其中的数据是否有用
>>:将新的数据累加在现有数据的后面
eg:ls -al>testfile
将ls指令的显示结果发送到testfile文件中去
who>>testfile
将who指令的结果累加到testfile
输入输出重定向
标准错误输出
在操作的过程中经常会遇到错误提示信息,为了便于未来分析,通常会将它们保存起来,其操作符号为2>和2>>
eg:cd/home/swh 2>errorfile
将错误输出发送到errorfile中去
vi errorfile
查看errorfile的内容
输入输出重定向
典型用法
将标准错误输出与标准输出分别放在不同文件中
command >stdinfile 2>errorfile
eg: echo $PATH $MALI 1>stdinfile 2>errorfile
正确信息输入stdinfile,错误信息输入文件errorfile
输入输出重定向
典型用法
将标准错误输出与标准输出同时放在文件filename中
command 1>filename 2>&1
command &>filename
输入输出重定向
思考:上例中的rightfile、errorfile、listfile1、 listfile2、
listfile3中的内容分别是什么?
输入输出重定向
输入输出重定向
典型用法
使用虚拟设备/dev/null丢弃不需要的输出信息,例如错误信息或者已知的某些提示等
command 1>stdinfile 2>/dev/null
eg: $find /home -name .bash_history >stdinfil 2>/dev/null
正确信息输入文件stdinfile中,错误信息丢弃
输入输出重定向
适用范围
需要保存重要的屏幕输出信息时;
希望保存后台执行的程序的输出结果时:为了能够根据反馈信息判断程序是否达到设计要求,通常会将后台的程序的执行结果放在指定的文件中去;
系统开机启动等例行性指令需要保存时
需要丢弃无用的信息时
需要分别输出正确和错误信息时
管道指令
当前一个指令的输出为stdout(正确输出)时才可以进行下一个指令,此时第二个指令的输入为前者的输出
eg:last
该指令将曾经登录过系统的用户的账号记录下来,同时还记录了登录时间、登录终端号等信息
last | grep root
last | grep root | wc -l
管道指令
优点:
管道在内存中实现,无需数据装入外存后再处理,节省了大量时间
中间数据可以不必保存,节省了大量外存空间
缺点
可能产生大量I/O,进程(命令)间仅能进行单向通信
常用管道指令(过滤器)
cut:分离参数
sort:将结果进行排序,便于比较
wc:计算结果中的行数、字数、字符数
tee:同时将结果发送到屏幕和指定文件中
uniq:重复行唯一显示(即只显示一次)
grep:撷取指定行
上述指令均为常出现在管道指令行中的特殊指令,它们也可以单独使用
管道指令
cut -d “separator” [-cf] fields filename
-d:代表后接分隔符
-c: 代表后接的是第几个字符
-f:表示后接第几个区块
对某一行中的数据进行分离以便对其操作
管道指令
eg:cat /etc/shadow | cut –d “:” –f 1
查找文件/etc/shadow的每行第一个区块
cat /etc/shadow | cut –c 10-15
将shadow文件中每行的10-15号字符提取出来
last | cut –d “ “ –f 1
仅查找所有的用户账号
管道指令
sort [-t 分隔符] [(+start) (-end)] [-nru] filename
-t 分隔符:用来分隔不同的区块
+start –end:从start区块开始排序,到end结束,注意这里的编号是从0开始的
-n:按数字排序
-r:反向排序
-u:只列出首次出现的行
管道指令
eg1:查看文件/etc/passwd,并按照第一个区块的首字母排序
cat /etc/passwd | sort
eg2:查看文件/etc/passwd,并按照用户ID排序
cat /etc/passwd | sort –t : +2 –n
管道指令
wc [-lmw] filename统计指令
-l:计算行数
-m:计算字符数
-w:计算字数
管道指令
eg: cat /etc/passwd | wc –l
统计文件的总行数
cat /etc/passwd | wc –m
统计文件的总字符数
cat /etc/passwd | wc –w
统计文件的总词(word)数
管道指令
tee -a filename 双向重定向指令
该指令除了将数据导入指定文件外还将其显示到屏幕上
-a:将数据向后累加
eg: cat /etc/passwd | tee -a /home/swh/feedback |wc –l
vi /home/swh/feedback
屏幕上显示行数,而feedback文件中放的是cat指令的反馈结果
指令练习
写一条shell命令(使用管道和重定向),将文件lonely排序并把含有字符串“lonely”的行存入文件it’s
lonely中
写一条命令,将文件godisagirl反向排序并用mail指令发送给用户user
将文件/etc/shadow复制到/home/user中,再用一条命令将复制文件第二栏按数字反向排序并将结果保存在文件sortfile中
管道指令
uniq [-ic] filename
-i:忽略大小写,即两行中仅大小写不同时认为是相同行
-c: 显示相同行的数目
该指令通常对排序后的文件有效,因此其管道前端通常连接sort指令
管道指令
grep [-acinv] ‘word’ filename 撷取指令
-a:在二进制文件用文本方式查找word字符串
-c:计算找到word字符串的次数
-i:不区分大小写
-n:输出时显示行号
-v:显示没有word的行
管道指令
eg:last | grep ‘root’
查找以root身份登录的信息
last | grep –v ‘root’
查找以非root身份登录的信息
管道指令
搜寻指定字符串,且输出时显示行号:
grep –n love loveis
利用中括号[ ]指定搜寻范围,且显示行号
grep -n ‘l[io][kv]e’ loveis
注:当使用的搜索字符串是一个指定的范围时,最后用引号将其括起来
管道指令
grep指令中的单个字符“.”与多个字符“*”
.取代任意一个字符,*取代0个或多个其前面的那个字符
grep -n l…e loveis
grep -n ‘l…e’ loveis
grep -n rrr* loveis
grep -n r* loveis
管道指令
管道符号后的某些指令若要求必须指明被操作文件名称时,可以使用“-”来声明
eg:tar -cvf - /home| tar -xvf -
将前一个tar指令的操作结果(正确输出)发送到后一个tar指令的标准输入文件,此时无需再将标准文件复制到外存,节省了系统开销
十三、Shell指令(二)
知识点
Bash的环境配置
Bash的环境通过变量来管理
重要的环境变量
PATH、MAIL、HISTSIZE、USER、HOSTNAME等
PS1、$、?
OSTYPE、HOSTTYPE、MACHTYPE
Bash的环境配置
PS1
用来说明命令行提示效果,默认为“[\u@\h \W]\$”
\d:格式为“星期 月 日”的日期
\H:完整主机名
\h:只显示第一个主机名
\t:显示格式为“HH:MM:SS”的24时制的时间
\T:显示12时制的时间
\A:显示格式为“HH:MM”的24时制的时间
\u:当前登录的用户账号
\v:bash的版本信息
\w:显示当前工作目录的绝对路径
\W:仅显示当前工作目录的名称
\#:当前执行的是本shell中的第几号命令
\$:指令提示符,root显示为#,其他用户为$
Bash的环境配置
注意本例中单双引号对PS1赋值造成的不同影响
Bash的环境配置
?
用来记录刚执行过的上一条指令的返回值
返回值为0,表示上一条指令执行成功
返回值非0,表示上一条指令执行失败,其数值表示了错误的类型
$
用来表示当前shell的进程号
echo $$
显示结果为某个数值#,使用top -p #指令,可以看到该shell的一些运行信息
OSTYPE、HOSTTYPE、MACHTYPE
声明硬件和内核的等级,用于系统内核优化
知识点
Bash的使用环境
命令查找顺序
登录与欢迎信息
环境配置文件
通配符与特殊符号
指令连接符
指令查找顺序
在不同位置处可能存在同名指令,其执行顺序如下:
1、若给定命令的绝对路径,则按指定位置处指令执行
2、若没有给定指令绝对路径,则首先查找是否有对应别名指令
3、接着查找bash内置指令(builtin)
4、根据PATH变量的值顺序查找第一个匹配指令
指令查找顺序
注意上图中两次执行的ls指令并不相同,第二次执行的是ls的别名指令
登录与欢迎信息
登录bash文本终端时会显示登录界面与欢迎信息,默认包含
Linux版本号
版本代号
内核版本号
硬件平台等级
本地登录端
登录与欢迎信息
登录欢迎消息
/etc/issue
用于设置登录字符终端前显示的系统提示信息
/etc/issue中使用的各参数的含义
\d:显示本地日期
\l:显示登录终端号
\m:显示硬件等级
\n:显示主机网络名
\o:显示域名
\r:显示操作系统发行版本(release)号码等信息,相当于uname -r
\t:显示本地时间
\s:显示操作系统名称
\v:显示操作系统的版本(version)信息
环境配置文件
shell类型
login shell:需要输入账号密码才能启动的shell环境
主要使用配置文件/etc/profile和~/.bash_profile
执行上述文件的配置过程时可能还会调用/etc/inputrc、/etc/profile.d/*.sh、/etc/sysconfig/i18n等文件
non-login:不需要输入账号密码才能启动的shell环境,例如图形界面下打开终端窗口、在终端窗口执行bash指令等都属于此类
主要使用~/.bashrc,该文件中包含用户自定义的alias别名和调用系统环境变量的操作
其他重要配置文件
/etc/man.config、~/.bash_history、~/.bash_logout等
环境配置文件
基本环境配置文件读取流程
环境配置文件
Bash的系统环境配置文件
/etc/profile
多用户共享的重要环境变量所在的主配置文件,最好不更改
必须更改时应注意是否对其他用户造成错误影响
/etc/sysconfig/i18n
用于设置系统的主语言变量,用户自己的个人设置不要在这里保存
/etc/bashrc
根据用户权限设置umask、PS1、PATH等的配置值
/etc/profile.d/*.sh
对Bash环境进行更深入设置的脚本文件
/etc/man.config
记录man page的搜索路径,不同linux版本中该文件名有细微差别
以上配置通常在注销再登录后更为有效
环境配置文件
Bash的个人环境配置文件
~/.bash_profile、~/bash_login、~/.profile
用于设置用户登录时的个性化配置,系统会在登录时依上述次序读取这三个文件,只要有一个起效即可
~/.bashrc
用于记录用户的非登录shell中有效的个人设置,每个新的non-login
shell启动时均会将其中的设置执行并生效
~/.bash_history
记录曾经执行过的指令,可记录的条数由HISTSIZE的值决定
~/.bash_logout
记录注销系统时应做的事情,用户可以将自己定义的注销动作记录在内
环境配置文件
Bash的登录过程中配置文件的起效时间
用户登录后,一些特殊的系统变量会被多次累加赋值
系统启动时,/etc/profile先起效,在执行该文件时会将各种配置文件逐一执行
用户登录时,系统将读取用户个人设置文件~/.bash_profile等,并令其生效
每次启动一个非登录shell时,将根据登录用户账号,主动执行~/.bashrc,将各种自定义的设置生效
通配符与特殊符号
键盘快捷键
Ctrl+C:终止当前命令
Ctrl+D:结束键盘输入
Ctrl+M:回车
Crtl+U:删除当前的整行命令
Ctrl+Z:暂停当前命令
通配符与特殊符号
通配符
*:0到多个任意字符
?:1个任意字符
[]:一个中括号中的字符
[ - ]:-号用于指定范围,凡在该范围内的字符均可选,但一次只能选一个
[^ ]:表示反选,即该位处为一个非中括号给定范围内的字符
通配符与特殊符号
显示/etc目录下所有以cron开头的文件名
通配符与特殊符号
特殊符号
#:批注符号,其后的内容视为不必执行的字符串,常见于脚本
&:后台操作控制符,放置在一条指令后,用于将指令放入后台执行
!:逻辑非运算,常见于脚本
/:目录结束符
其他
\、|、$、<、>、>>、’ ’、” ”、` `等
指令连接符
基本指令连接符
;:前一条指令执行完成后,后一条指令一定会执行
||:前一条指令执行出错后,后一条指令才会执行
&&:前一条指令正确执行后,后一条指令才会执行
多个连接符出现时,一定要注意指令的放置顺序
eg:当文件/home/swh/work不存在时,指令ls /home/swh/work && echo “exist” ||echo
“not exist”是正确的,而ls /home/swh/work || echo “not exist”&& echo
“exist”则会同时显示“not exist”和“exist”两个结果
指令连接符
十四、正则表达式
知识点
正则表达式定义
通过特殊字符的排列形成的表达式,用以搜索、替换、删除含有指定字符串的一行或多行内容
功能:
进行字符串处理;
帮助系统管理员快速处理大量信息,以简化和优化管理流程;
在脚本中发挥多项重要作用
分类:基本正则表达式和扩展正则表达式
使用:正则表达式需要嵌入指令中才能发挥作用
正则表达式定义
使用正则表达式时请注意
设置LANG=C:中文语系中大小写字母是交叉编码的,不利于进行筛选
设置grep --color=auto别名为grep :可以将所选内容加上颜色提示
知识点
基本正则表达式
正则表达式通常用于需要指定字符串的指令中
如grep需要根据给定字符串搜索文本行
基本正则表达式
基本正则表达式与grep的结合
Usage 1:指定字符串
当已知所需字符串时,只需要将字符串直接写出即可
Usage 2:集合字符串
使用“[ ]”指定某一个位上可能出现的字符
使用“[^ ]”指定某一个位上不要出现的字符
在“[ ]”内可以指定数字或字符范围(以ASCII码值为准)
如搜索某位上含有a、b或c的字符串,只需在该位上输入[a-c]即可
基本正则表达式
grep -n ‘t[ae]st’ filename
grep -n ‘oo’ filename
grep -n ‘[^g]oo’ filename
grep -n ‘[^a-z]oo’ filename
grep -n ‘[0-9]’ filename
基本正则表达式
Usage 3:.和*
“.”表示一个任意字符,“*”表示0到多个连续的指定字符
grep -n ‘goo*g’ filename
grep -n ‘g*g’ filename
grep -n ‘g.*g’ filename
grep -n ‘[0-9][0-9]*’ filename
基本正则表达式
基本正则表达式
基本正则表达式
Usage 4:根据行首或行尾字符进行筛选
正则表达式中,用“^”表示行首,用“$”表示行尾
“^”出现在“[]”中,表示“非”的意思
但若用于中括号之外,则表示行首
grep -n ‘^the’ filename
grep -n ‘^[a-z]’ filename
grep -n ‘^[^a-z]’ filename
grep -n ‘\.$’ filename
grep -n ‘^$’ filename
基本正则表达式
基本正则表达式
基本正则表达式
基本正则表达式
基本正则表达式
Usgae 5:根据指定字符连续出现的个数进行筛选
需要使用“{}”来声明字符重复的个数,此处的“{}”都需要分别转义,使其成为普通字符
grep -n ‘o\{2\}’ filename
grep -n ‘go\{2,5\}g’ filename
grep -n ‘go\{2,\}g’ filename
基本正则表达式
基本正则表达式
总结
^word:字符串word出现在行首的行
word$:字符串word出现在行尾的行
.:一个任意字符
\:转义字符,只转一个后邻字符
*:零个或多个前邻字符
\{n,m\}:连续n到m个前邻字符
[ ]:指定位上可能出现的字符集合
基本正则表达式
与通配符的区别
通配符适用于不支持正则表达式的命令
典型用法1:*做通配符时表示“0到多个任意字符”,在正则表达式中表示“0到多个相同的前邻字符”
典型用法2:通配符的取非用[!range],正则表达式用[^range]
基本正则表达式
与正则表达式配合的常用指令
grep
sed
sed文本加工工具
sed ‘[-nr] [动作]’filename
该指令将输入文件的每一行分别读取后进行指定处理,并将结果发送到屏幕,然后继续处理下一行
选项说明
-n:使用安静模式,只显示被处理过的行,没有处理的行不输出
-r:支持扩展正则表达式
sed文本加工工具
sed ‘[-nr][动作]’filename
动作说明
动作的格式通常为 [n1[,n2]]function
n1和n2代表起止行号(含),$表示最后一行,也可以用正则表达式给出行号范围
常用的function有:
a:新增,将a后出现的字符串添加在a前给出的行下面
c:替换,将n1到n2之间行替换为c后指定的字符串
d:删除,d后不用加字符
i:插入,将i后出现的字符串插入到i指定的行之前
p:打印,将指定行打印,通常与-n选项同时使用
s:搜索,通常与正则表达式同时使用,既能搜索也可以替换
s/将要被替换的字符串/新的字符串/g
sed文本加工工具
删除行功能
nl godisagirl | sed ‘2,5d’
nl godisagirl | sed ‘2d’
nl godisagirl | sed ‘2,$d’
sed文本加工工具
新增行功能(追加)
nl godisagirl | sed ‘2a love is blind’
nl godisagirl | sed ‘2a Love is blind\
Love never dies!’
注意本例中新增多行内容时,要在每行最后加入\
sed文本加工工具
新增行功能(插入)
nl godisagirl | sed ‘2i love is blind’
sed文本加工工具
显示指定行功能
nl godisagirl | sed -n ‘5,7p’
注意:此例中的-n选项用于告知sed仅显示被处理过的行,其他的行不显示,若不加该选项则会分别连续显示两次第5行、第6行和第7行。
原因:sed按行读入内容并将其发送往屏幕显示,若某行被加工过,则将加工后的内容也显示出来。
sed文本加工工具
替换行功能
nl godisagirl | sed ‘2,46c You make my heart SMILE’
sed文本加工工具
部分数据查找与替换功能
格式:sed ‘s/被替换字符串/新字符串/g’
nl godisagirl | sed ’s/girl/boy/g’
sed文本加工工具
部分数据查找与替换功能(示例)
ifconfig eth1 |grep inet |sed ‘s/^.*addr://g’|sed s/Bcast.*$//g’
本例的执行结果应获取上图中的网络地址
sed文本加工工具
部分数据查找与替换功能(示例)
ifconfig eth1 |grep inet |sed ‘s/^.*addr://g’|sed s/Bcast.*$//g’
sed文本加工工具
与正则表达式的配合
cat /etc/man.config | grep ‘MAN’ | sed ‘s/#.*$//g’| sed ‘/^$/d’
此处的’/^$/d’中的两个“/”用于给定空行特征,不能省略,否则会报错
知识点
扩展正则表达式
扩展正则表达式由基本正则表达式组合或扩展而成
常见的支持扩展正则表达式的指令有egrep
扩展正则表达式
+
重复“1个或多个前邻字符”
Eg:egrep –n ‘go+d” greptest.txt可搜索含god、good、gooood等字符串的行
?
重复“0个或1个前邻字符”
Eg:egrep –n ‘go?d’ greptest.txt可搜索含gd、god字符串的行
|
表示“或”关系
Eg:egrep -n ‘gd|good|dog’ greptest.txt可搜索含有gd、good、dog的行
()
指定在括号处可以出现的字符串
Eg: egrep -n ‘g(la|oo)d’ greptest.txt可搜索glad、good两个字符串所在的行
若某个字符串连续重复出现,可以使用“(重复字符串)+”的形式搜索
扩展正则表达式
扩展正则表达式
十五、Shell 脚本
知识点
Shell Script
定义:
利用 shell
自带功能和指令写的一个程序,该程序使用纯文本格式,它汇聚了实现用户所需处理目标的多条指令,并一次性执行,无需编译
系统中许多服务均由Shell script启动
Shell script 的运行速度较慢,且占用的 CPU
资源较多,造成主机资源分配不良,不利于复杂和大量数据运算
Shell Scripts的用途
自动化管理的工具
跟踪管理系统的助手
简单入侵检测功能
执行连续指令
简易的文件处理
支持跨平台
脚本的执行
将 shell.sh 加上可读与可执行 (rx) 权限,然后就能够以 ./shell.sh 來执行了
eg: ]# chmod 755 hello-sh01.sh
]# ./hello-sh01.sh
以 sh shell.sh 的方式直接执行即可
eg:sh hello-sh01.sh
脚本的执行
shell是逐字符读入脚本文件的
当读入回车后,shell将执行读入的这行指令
指令间的空格、空行和Tab将被bash自动忽略
当bash读入了一个#后,它就明白从这里开始到这行结束的内容都是注释而非要执行的内容
对用户而言,若一行内容太多,可以使用转义符号“\”将回车符号转义为换行但不断行的符号,实现一行内容多行书写的要求
撰写脚本的要求
第一行要说明脚本使用的 shell 名称
接着是脚本功能描述、版本信息等内容
每个功能程序段前做注释说明
判断指令test
该指令利用特定参数实现对文件或数据的多种判断操作,是脚本文件中常用的文件处理工具
eg: test -e /home/swh/loveis.txt && echo “exist” || echo “not exist”
判断文件loveis.txt是否存在并告知用户
test -r godisagirl -a -x godisagirl
当godisagirl的权限为可读可执行时返回true
判断指令test
eg: test -b /dev/hda1
判断hda1是否为块设备文件
判断指令test
判断指令test
判断指令test
判断指令test
判断指令test
判断符号[ ]
利用判断符号[ ]也可以实现上述功能,在[
]中出现的就是test指令的各个选项及参数,即[ ]取代了指令test出现在命令行中
若将其嵌入其他指令内,则会先执行[ ]内的测试要求,返回结果后继续执行外层指令
在[ ]中的每个组成部分间必须用空格分隔
eg: [root @swh swh]# [ -n $PATH ]
这里每个组件间都有空格,用来判断变量$PATH是否为空
[ ]之间可以用&&或|| 结合
[ ]中的变量用双引号设定,常量则单双皆可
脚本中的数据类型
字符
整数
指针:内存中某存储单元的地址
字符串
数组结构
使用方法为${array[index]},下标index从0开始计数
脚本中的数据类型
类型声明指令declare
格式:declare [-iafrx] var
i、a、f、r、x分别用来声明整数、数组、函数、只读类型变量和环境变量
只读型变量不可修改和删除
默认情况下是字符和字符串类型
脚本语言是弱类型语言
脚本中的数据类型
eg:#!/bin/bash
declare -i x=2
declare -i y=3
declare -i z=$y-$x
declare -a array=(1 2 3)
脚本范例
hello-sh01.sh 脚本基本要求
功能:每次执行都显示一个“hello,everybody!”的字符串
注意:在脚本开头的注释部分要尽量详细的将本脚本设计功能、修改历史写清楚,最好将编写人员的联系方式也加入其中
在脚本的最初部分将环境变量设置好
脚本范例
uservar-sh02.sh 交互式脚本的设计
功能:将用户先后输入的两个整数求和并输出
注意:使用指令实现用户与脚本的交互
read [-p 提示字符串] [-t 等待秒数n] 变量名varname
显示p后的提示信息,若等待
n秒后没有输入则该指令忽略,若有输入,则回车前的所有字符被记录为varname的值
eg: [root @swh swh] read songname
mylove #该行是用户输入的
[root @swh swh] echo $songname
mylove #该行是系统响应的
脚本范例
testusage-sh03.sh 学会使用test条件
功能:利用test指令的相关选项判断指定文件的类型和权限
条件判断
if …then…fi
case…esac
条件判断
基本格式
if command1
then
command2
fi
if语句的基本功能是先执行command1,如果其正确执行(即执行完成后变量?的值为0
) ,则执行command2,否则跳过该if语句,执行接下去的指令/语句
eg: #!/bin/bash
if date
then
echo $?; echo “done!’
fi
条件判断
其他格式
if [ 条件1 ] &&( || ) [条件2 ] ; then
elif [ 条件3 ] &&( || ) [条件4 ] ; then
else
fi
eg: if [ “$songname” = “godisagirl” ] ; then
echo “songname is God is a girl”
else
echo “songname is not God is a girl”
fi
此格式中的elif语句可以有多个
脚本范例
iftest-sh04.sh
功能:将用户输入的1-3这三个选项用英文表示出来
注意:一个中括号中只能放一个条件
脚本范例
思考
检查当前用户家目录中是否有名为testing的可写文件,若有显示文件存在并可写入的提示,否则显示无法写入该文件
特殊符号
双圆括号
可用于指定高级数学公式
格式: ((数学表达式))
常用符号:
val++、val–:后增量、后减量
++val、–val:前增量、前减量
!、&&、||:逻辑非、逻辑与、逻辑或
~、&、|:按位取反、按位与、按位或
**n:n次幂
条件判断
case $变量名称 in
“变量值1")
指令程序段1
;;
“变量值2")
指令程序段2
;;
*)
不包含第一个变量内容与第二个变量内容的其他指令程序段
;;
esac
条件判断
找不同:
case $l
“hello”)
echo “Hello, world!”
;;
“bye”)
echo “bye, world!”
;;
*)”
echo “there is anybody!”
exit 1
;;
esac
脚本范例
casetest-sh05.sh
功能:将用户输入的1-3这三个选项用英文表示出来
提示:每个case分支的变量值都可以是多个,用符号|连接,表示满足其中一个变量值即可执行该分支的指令程序段
循环
for (( 条件1; 条件2;条件3)) do done
while [条件1] && {||} [条件2] …
do
done
until [ 条件1 &&{||} [条件2]…
do
done
循环
while [ 条件 ]
do
指令段
done
该语句表示当条件满足时,执行指令段,不满足的时候跳出
eg:whiletest-sh06.sh
使用while语句实现1到100的连加
循环
until [ 条件 ]
do
指令段
done
该语句表示当条件不满足的时候执行指令段,满足条件的时候跳出循环
eg:untiltest-sh07.sh
使用until语句实现1到100的连加
循环
for (( 初值 ;终值 ;步长 ))
do
指令段
done
以指定的变量为控制条件,从初值到终值进行循环,步长指定
eg:fortest-sh08.sh
使用for语句实现1到100的连加
调试脚本
利用sh指令
sh [-nvx] scripts.sh
-n:查询并指出语法错误并不执行
-v:执行脚本前显示脚本内容至屏幕
-x:只将用到的脚本内容显示出来
十六、Shell实用指令之进程
知识点
进程的特征与状态
由于程序执行的结果具有不可再现性,因此不能参与并发执行
进程是为了保证程序可以并发执行,且对并发程序加以描述和控制而出现的
进程定义
定义
进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
这个定义包含三方面内容
是程序的一次执行
是一个程序及其数据在处理机上顺序执行时所发生的活动
是程序在一个数据集合上运行的过程,系统在进行资源分配和任务调度时将其视为一个独立的单位
进程的基本状态
就绪状态
进程获取了除CPU外的所有所需资源后,就处于就绪状态,所有的处于该状态的进程按照一定方式排列为就绪队列
执行状态
就绪状态的程序获取CPU后,立即执行,此时称进程处于执行状态;根据OS不同,执行状态的进程个数也有区别
阻塞状态
正在执行的进程由于某些原因(I/O请求、申请缓冲空间等)暂时放弃处理机而处于暂停状态
处于阻塞状态的进程也被排列为阻塞队列
进程的基本状态
进程的基本状态
各状态间的转换
各状态间的转换需要特殊事件触发
就绪→执行:就绪进程获得CPU
执行→就绪:正在执行的当前进程所持时间片用尽,则暂停执行,转为就绪进程
执行→阻塞:当前进程所需的资源暂时无法获得(如I/O设备)或其他前趋工作尚未完成,则进程转为阻塞状态
阻塞→就绪:阻塞进程被阻塞的原因已经解决或所需资源已经获得,则转为就绪进程等待调度
进程属性
Linux系统中,各进程均有其特定属性
UID、PID、进程名、进程状态、PPID、进程已执行时间、进程所在终端等
进程属性可以使用ps命令查看
ps命令在不同类UNIX发行版本中的选项有异
System V(UNIX)中选项前加“-”,BSD中不加“-”,GNU前加“–”
各版本的大部分选项可以自由组合(freely mixed)
进程属性
ps [options]
常见选项组合
ps -e/-A 显示所有进程信息
ps ax/ps aux 查看所有系统运行进程信息
ps axjf 显示进程家族树
ps –p n显示PID为n的进程信息
ps -u username 显示账号为username的用户所拥有的进程
进程属性
ps [options]
常见选项组合
ps –l 以长格式显示进程信息
长格式中的信息包括标志F、状态S、进程拥有者UID、进程号PID、父进程号PPID、优先权PRI、进程大小SZ、进程是否在运行WCHAN、进程所处终端TTY、累计运行时间TIME、命令COMMAND等
状态:S表示休眠,D表示不可中断的休眠,R表示运行,Z表示僵死(其父已死,其祖回收资源),T表示被追踪或停止
ps –r显示所有处于运行态的进程信息
进程属性
ps [options]
常见选项组合
ps aux 查看系统中的所有进程,包括所有终端上的所有用户所拥有的全部进程
显示信息包括:拥有者USER、进程标识符PID、占用CPU的比例%
CPU、占用内存的比例%MEM、使用虚拟内存量VSZ、使用的固定内存量RSS、进程所使用的终端号TTY、进程状态STAT、进程触发时间START、进程使用CPU的时间TIME、进程命令COMMAND
进程属性
ps aux显示信息中STAT表示状态
S表示休眠,D表示不可中断的休眠(如等待I/O返回),R表示运行,Z表示僵死(停止但无法清除出内存),T表示后台暂停或除错状态,X表示死亡
在BSD版本中,可能出现附加状态字符:<表示高优先权,N表示低优先权,s表示会话组长,l表示多线程,+表示前台程序,L表示页面被锁定在存储器中
任务管理器top
显示系统中的进程状态并交互控制这些进程
指令格式
top [-dbnp]
d:后接进程画面更新的秒数
b:以批处理方式执行top,常搭配重定向操作,将批处理结果输出为文件
n:与b配合,表示记录几次top的输出结果
p:观测指定PID的进程执行情况
任务管理器top
任务管理器top
top的交互指令
?:显示可用的top命令
P:按CPU的使用量排序
M:按内存使用量排序
N :按PID排序
k :指定结束(kill)的进程号PID
d或s:修改更新间隔,默认为3’’
q :退出top,返回上层
任务管理器top
每2秒观测一次整个系统中的进程执行情况
top -d 2
执行两次top,并将结果保存在/home/tony/toptwice
top -b -n 2 >/home/tony/toptwice
观察PID为3的进程的执行情况,时间间隔为2秒
top -d 2 -p 3
进程家族树pstree
pstree [-up]显示系统中进程的家族关系
p:列出进程PID
u:对拥有者非当前pstree拥有者的进程,显示其拥有者账号
进程管理
使用kill指令可以向其他进程发送消息,达到管理进程的目的
kill PID:杀死指定进程,若不成功,加消息-9
kill -l:查看可用的所有消息
kill -# PID
PID:接收信号的进程标识符
#:要发送的信号编号,重点关注:
1号(SIGHUP)重新启动指定进程
2号(SIGINT)中断指定进程(相当于键盘消息Ctrl+C)
9号(SIGKILL)强制终止指定进程(无条件终止)
15号(SIwhile
ERM)正常终止指定进程
19号(SIGSTOP)暂停指定进程(相当于键盘消息Ctrl+Z)
进程管理
进程优先级
PRI(Priority):通常所谓的进程优先级,值越小优先级越高,该值由内核动态调整,用户无法修改
NI(Nice):用户可以修改的用于修正PRI的优先权值,默认为0
关系:PRI(new)=PRI(old)+NI
注:虽然在PRI上加入了NI,但最终值由内核动态确定
进程管理
Nice值的说明
取值范围:-20~19或0~19
root用户可以调整其他用户进程的nice值,一般用户只能调整自己的nice值,且只能取值0~19,同时只能调大该值(降低优先级)
进程管理
设置进程优先级的指令
nice:在进程刚开始执行时即指定nice值
renice:修改已执行进程的nice值
进程管理
nice -n nice值 指令
nice值:取值为-20~19(root用户)或0~19(普通用户)
注1:该指令仅对独立进程(外部指令、shell脚本等)使用,不能对内部指令、管道、复合命令等使用
注2:该指令最好对后台运行程序使用
进程管理
eg1:某计算程序calc需要运行数小时进行复杂运算,此时可以使用nice将其优先级降低
nice -n 19 calc >stdout >stderr &
eg2:以root身份将一个vim进程放入后台执行,设其初始nice值为5
nice -n 5 vim nicefile &
查看该vim程序的优先级
ps -l //注意观察vim与当前bash的PRI项的大小差异
将刚才的vim程序调入前台查看
jobs //查看当前作业号,+表示当前作业,-表示前一个作业
fg %[jobnum] //将指定号码的作业移到前台
在vim中使用Ctrl+Z将该vim程序再次放入后台
bg %[jobnum] //将指定号码的前台作业移到后台
终止该vim程序
kill -9 %[jobnum]或kill -9 PID
进程管理
renice 新nice值 -p PID
将指定进程的nice值改为指定的新值
进程管理
在不同类UNIX发行版本中的选项有异
System V(UNIX)中选项前加“-”,BSD中不加“-”,GNU前加“–”
各版本的大部分选项可以自由组合(freely mixed)
进程属性
ps [options]
常见选项组合
ps -e/-A 显示所有进程信息
ps ax/ps aux 查看所有系统运行进程信息
ps axjf 显示进程家族树
ps –p n显示PID为n的进程信息
ps -u username 显示账号为username的用户所拥有的进程
进程属性
ps [options]
常见选项组合
ps –l 以长格式显示进程信息
长格式中的信息包括标志F、状态S、进程拥有者UID、进程号PID、父进程号PPID、优先权PRI、进程大小SZ、进程是否在运行WCHAN、进程所处终端TTY、累计运行时间TIME、命令COMMAND等
状态:S表示休眠,D表示不可中断的休眠,R表示运行,Z表示僵死(其父已死,其祖回收资源),T表示被追踪或停止
ps –r显示所有处于运行态的进程信息
进程属性
ps [options]
常见选项组合
ps aux 查看系统中的所有进程,包括所有终端上的所有用户所拥有的全部进程
显示信息包括:拥有者USER、进程标识符PID、占用CPU的比例%
CPU、占用内存的比例%MEM、使用虚拟内存量VSZ、使用的固定内存量RSS、进程所使用的终端号TTY、进程状态STAT、进程触发时间START、进程使用CPU的时间TIME、进程命令COMMAND
进程属性
ps aux显示信息中STAT表示状态
S表示休眠,D表示不可中断的休眠(如等待I/O返回),R表示运行,Z表示僵死(停止但无法清除出内存),T表示后台暂停或除错状态,X表示死亡
在BSD版本中,可能出现附加状态字符:<表示高优先权,N表示低优先权,s表示会话组长,l表示多线程,+表示前台程序,L表示页面被锁定在存储器中
任务管理器top
显示系统中的进程状态并交互控制这些进程
指令格式
top [-dbnp]
d:后接进程画面更新的秒数
b:以批处理方式执行top,常搭配重定向操作,将批处理结果输出为文件
n:与b配合,表示记录几次top的输出结果
p:观测指定PID的进程执行情况
任务管理器top
任务管理器top
top的交互指令
?:显示可用的top命令
P:按CPU的使用量排序
M:按内存使用量排序
N :按PID排序
k :指定结束(kill)的进程号PID
d或s:修改更新间隔,默认为3’’
q :退出top,返回上层
任务管理器top
每2秒观测一次整个系统中的进程执行情况
top -d 2
执行两次top,并将结果保存在/home/tony/toptwice
top -b -n 2 >/home/tony/toptwice
观察PID为3的进程的执行情况,时间间隔为2秒
top -d 2 -p 3
进程家族树pstree
pstree [-up]显示系统中进程的家族关系
p:列出进程PID
u:对拥有者非当前pstree拥有者的进程,显示其拥有者账号
进程管理
使用kill指令可以向其他进程发送消息,达到管理进程的目的
kill PID:杀死指定进程,若不成功,加消息-9
kill -l:查看可用的所有消息
kill -# PID
PID:接收信号的进程标识符
#:要发送的信号编号,重点关注:
1号(SIGHUP)重新启动指定进程
2号(SIGINT)中断指定进程(相当于键盘消息Ctrl+C)
9号(SIGKILL)强制终止指定进程(无条件终止)
15号(SIwhile
ERM)正常终止指定进程
19号(SIGSTOP)暂停指定进程(相当于键盘消息Ctrl+Z)
进程管理
进程优先级
PRI(Priority):通常所谓的进程优先级,值越小优先级越高,该值由内核动态调整,用户无法修改
NI(Nice):用户可以修改的用于修正PRI的优先权值,默认为0
关系:PRI(new)=PRI(old)+NI
注:虽然在PRI上加入了NI,但最终值由内核动态确定
进程管理
Nice值的说明
取值范围:-20~19或0~19
root用户可以调整其他用户进程的nice值,一般用户只能调整自己的nice值,且只能取值0~19,同时只能调大该值(降低优先级)
进程管理
设置进程优先级的指令
nice:在进程刚开始执行时即指定nice值
renice:修改已执行进程的nice值
进程管理
nice -n nice值 指令
nice值:取值为-20~19(root用户)或0~19(普通用户)
注1:该指令仅对独立进程(外部指令、shell脚本等)使用,不能对内部指令、管道、复合命令等使用
注2:该指令最好对后台运行程序使用
进程管理
eg1:某计算程序calc需要运行数小时进行复杂运算,此时可以使用nice将其优先级降低
nice -n 19 calc >stdout >stderr &
eg2:以root身份将一个vim进程放入后台执行,设其初始nice值为5
nice -n 5 vim nicefile &
查看该vim程序的优先级
ps -l //注意观察vim与当前bash的PRI项的大小差异
将刚才的vim程序调入前台查看
jobs //查看当前作业号,+表示当前作业,-表示前一个作业
fg %[jobnum] //将指定号码的作业移到前台
在vim中使用Ctrl+Z将该vim程序再次放入后台
bg %[jobnum] //将指定号码的前台作业移到后台
终止该vim程序
kill -9 %[jobnum]或kill -9 PID
进程管理
renice 新nice值 -p PID
将指定进程的nice值改为指定的新值
进程管理