shell基础知识
第10章shell基础知识
一、什么是shell
shell是系统跟计算机硬件交互时是使用的中间介质,它只是系统的一种工具。实际上,在shell和计算机硬件之间还有一层东西——系统内核。用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell在传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
1.记录命令历史
!是与命令历史有关的一个特殊字符,该字符常用的应用有以下3个。
口!!:连续两个!表示执行上一条指令。
口!n:这里的n是数字,表示执行命令历史中的第n条指令。例如,!13表示执行命令历史中的第13个命令。
上例中的history命令如果未改动过环境变量,默认可以把最近执行的100条命令历史打印
口!字符串(字符串大于等于1):例如!pw表示执行命令历史中最近一次以pw开头的命令。
2.命令和文件名补全
按tab键可以帮我们补全一个命令、一个路径或者一个文件名。连续按两次tab键,系统则会把所有的命令或者文件名都列出来。
3.别名
Alias,它也是bash所特有的功能之一。我们可以通过alias把一个常用的并且很长的指令另取名为一个简单易记的指令。如果不想用,可以使用unalias命令接触别名功能。直接执行alias命令,会看到目前系统预设的别名。
另外,也可以自定义命令的别名,格式为:alias [命令别名]=[‘具体命令’]
4.通配符
在bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符。
5.输入/输出重定向
输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>。另外,还有错误重定向命令2>以及追加重定向命令>>。
6.管道符
管道符 | ,它用于将前一个指令的输出作为后一个指令的输入。
7.作业控制
当运行进程时,可以使它暂停(按Ctrl+Z组合键),然后使用fg(foreground的简写)命令恢复它,或是利用bg(background的简写)命令使它到后台运行。此外也可以使它终止(按Ctrl+C组合键)。
使用vi命令编辑test1.txt,随便输入一些内容,按Esc键后,使用Ctrl+Z组合键暂停任务
此时提示vi test1.txt已经停止了,然后使用fg命令恢复它,此时又进入刚才的vi窗口了。再次使其暂停,然后输入jobs,可以看到被暂停或者在后台运行的任务。
如果想把暂停的任务放在后台重新运行,就使用bg命令。
但是vi似乎并不支持在后台运行,换一个其他的命令
多个被暂停的任务会有编号,使用jobs命令可以看到两个任务,使用bg命令或者fg命令时,则需要在后面加编号。这里使用命令bg 2把第2个暂停的任务放到后台重新运行(需要在命令后边加符号&,且中间有个空格) vmstat 1命令是用来观察系统状态的命令
如何关掉在后台运行的任务,如果没有退出刚才的shell,那么应该先使用命令fg编号把任务调到前台,然后按Ctrl+C组合键结束任务。
另一种情况则是,关闭当前的shell,再次打开另一个shell时,使用jobs命令并不会显示在后台运行或者被暂停的任务。要想关闭这些任务,则需要先知道它们的pid
使用&把任务放到后台运行时,会显示pid信息。如果忘记这个pid,还可以使用ps anx命令找到那个进程。如果想结束该进程,需要使用kill命令。
在结束时,不要忘记把后台的vi给结束掉,免得以后遇到困扰。
二、变量
环境变量PATH,它是shell预设的一个变量。通常,shell预设的变量都是大写的。变量就是使用一个较简单的字符串来代替某些具有特殊意义的设定以及数据。这个PATH就代替了所有常用命令的绝对路径的设定。有了PATH这个变量,我们运行某个命令时,就不需要输入全局路径,直接输入命令名即可。可以使用echo命令显示变量的值
1.命令env
使用env命令,可以列出系统预设的全部系统变量。
登录不同的用户,这些环境变量的值也是不同的。下面是常见的环境变量
口HOSTNAME:表示主机的名称
口SHELL:表示当前用户的shell类型
口HISTSIZE:表示历史记录数
口MALL:表示当前用户的邮件存放目录
口PATH:该变量决定了shell将到哪些目录中寻找命令或程序
口PWD:表示当前目录
口LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量
口HOME:表示当前用户的家目录
口LOGNAME:表示当前用户的登录名
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,可以使用set命令把系统预设的全部变量都显示出来。
2.命令set
set命令和env命令类似,也可以输出环境变量。
这并没有把全部内容都列出来,set命令不仅可以显示系统预设的变量,也可以显示用户自定义的变量。比如,自定义一个变量:
虽然你可以自定义变量,但是该变量只能在当前shell中设立,
使用bash命令可以再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shell,myname变量还在。如果想让设置的环境变量一直生效,分以下两种情况:
口允许系统内所有用户登陆后都能使用该变量。具体的操作方法是:在/etc/profile文件的最后一行加入export myname=Aming,然后运行source /etc/profile就可以生效了。此时在运行bash命令或者切换到其他账户(如su - test)就可以看到效果。
口仅允许当前用户使用该变量。具体的操作方法是:在用户主目录下的.bashrc文件的最后一行加入export myname=Aming,然后运行source .bashrc就可以生效了。这是在登录test账户,myname变量则不会生效了。这里source命令的作用是将目前设定的配置刷新,即不用注销在登陆也能生效。
上例中使用myname=Aming来设置变量myname,那么在Linux下设置自定义变量:
口设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格。
口变量名只能由字母、数字以及下划线组成,而且不能以数字开头。、
口当变量内容带有特殊字符(如空格)时,需要加上单引号。
有一种情况下需要注意,就是变量内容中本身带有单引号,这时就需要加双引号了
如果变量内容中需要用到其他命令,运行结果则可以使用反引号
变量内容可以累加其他变量的内容,但需要加双引号
如果不小心把双引号错加为单引号,则得不到你想要的结果
使用双引号时,不会取消双引号中特殊字符本身的作用(这里是$),而使用单引号时,里面的特殊字符将全部失去其本身的作用。
bash命令,如果在当前shell中运行bash指令,则会进入一个新的shell,这个shell就是原来shell的子shell,可用pstree指令查看,
如果没有该命令,运行yum install psmisc命令安装
在父shell中设定变量后,进入子shell时,该变量是不会生效的,如果想让这个变量在子shell中生效,则要用到export指令
其实export命令就是声明一下这个变量,让该shell的子shell也知道变量abc的值是123。设置变量之后,如果想取消某个变量,只要输入unset变量名即可
三、系统环境变量与个人环境变量的配置文件
口/etc/profile:这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。
口/etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符。
\u指用户,\指主机名,\w指当前目录,\$指字符#(如果是普通用户,则显示为$)
口.bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可以使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
口.bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。可以将用户自定义的别名或者自定义变量写道这个文件中。
口.bash_history:该文件用于记录命令历史。
口.bash_logout:当退出shell时,会执行该文件。
四、Linux shell中的特殊符号
1.*代表零个或多个任意字符
2.?只代表一个任意的字符
不管是数字还是字母,只要是一个字符,都能匹配出来
3.注释符号#
在Linux中表示注释说明,即#后面的内容都会被忽略
4.脱义字符\
这个字符会将后面的特殊符号(如*)还原为普通字符
5.命令cut
cut命令用来截取某一个字段,其格式为cut -d ‘分隔字符’ [-cf] n,这里的n是数字
口-d:后面跟分割字符,分割字符要用单引号括起来
口-c:后面接的是第几个字符
口-f:后面接的是第几个区块
cut命令的用法:
-d选项后面加冒号作为分隔字符,-f1表示截取第一段,-f和1之间的空格可有可无
-c选项后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1、n2和n3
6.命令sort
sort命令用做排序,其格式为sort[-t 分隔符][-kn1,n2][-nru],n1和n2都是指数字
口-t:后面跟分隔字符,作用cut的-d选项一样
口-n:表示使用纯数字排序
口-r:表示反向排序
口-u:表示去重复
口-kn1,n2:表示由n1区间排序到n2区间,
如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,按升序输出
-t选项后面跟分隔符,-k选项后面跟单个数字表示对第几个区域的字符串排序,-n选项则是表示使用纯数字排序
-k选项后面跟数字n1和n2表示对第n1和n2区域内的字符串排序,-r选项则表示反向排序。
7.命令wc
wc命令用于统计文档的行数、字符数或词数。常用选项有-l(统计行数)、-m(统计字符)和-w(统计词数),
如果wc不跟任何选项,直接跟文档,则会把行数、词数和字符数依次输出。
8.命令uniq
uniq命令用来删除重复的行,只有-c选项比较常用,它表示统计重复的行数,并把行数写在前面。
使用uniq前,必须先给文件排序,否则不管用。
9.命令tee
Tee命令后面跟文件名,其作用类似于重定向>,但它比重定向多一个功能,即把文件写入后面所跟的文件时,还显示在屏幕上。该命令常用于管道符|后
10.命令tr
tr命令用于替换字符,常用来处理文档中出现的特殊符号,常用的选项:
口-d:表示删除某个字符,后面跟要删除的字符。
口-s:表示删除重复的字符
tr命令常用于把小写字母变成大写字母,如tr ‘[a-z]’‘[A-Z]’
不过替换、删除以及重复等操作都是针对一个字符来讲的,有一定的局限性。
11.命令split
split命令用于切割文档,常用的选项为-b和-l
口-b:表示依据大小来分割文档,单位为byte
如果split不指定目标文件名,则会以xaa、xab…这样的文件名来存取切割后的文件,我们也可以指定目标文件名
口-l:表示依据行数来分割文档
12.特殊符号$
符号$可以用作变量前面的标识符,还可以和!结合起来使用
!$表示上条命令中的最后一个变量,本例中上条命令最后是testb.txt,那么在当前命令下输入!$则代表testb.txt
13.特殊符号~
符号~表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username
15.特殊符号&
如果想把一条命令放到后台执行,则需要加上符号&,它通常用于目录运行时间较长的情况