shell是系统跟计算机硬件交互时使用的中间戒指,只是系统的一个工具。在shell和计算机硬件之间还有一层东西——系统内核。用户直接面对的不是计算机硬件而是shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
1.记录命令历史:
我们执行过的命令Linux都会记录,预设可以记录1000条历史命令。这些命令保存在用户的家目录的bash_history文件中。但需要注意的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至bash_history文件中。
!! :连续两个!表示执行上一条命令。
!n :这里的n是数字,表示执行命令历史中的第n条命令。
!字符串(字符串大于等于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命令。
多个被暂停的任务会有编号,使用jobs命令可以看到多个任务,使用bg命令或者fg命令时,则需要在后面加上编号
如果没有退出刚才的shell,那么应该先使用命令fg编号把任务调到前台,然后按Ctrl+C组合键结束任务。
另一种情况则是关闭当前shell,再次打开另一个shell时,使用jobs命令并不会显示在后台运行或者被暂停的任务。要想关闭这些任务,则需要知道他们的pid。
使用&把任务放到后台运行时,会显示pid信息。如果忘记这个pid,还可以使用ps aux命令找到那个进程。如果想要结束该进程,需要使用kill命令。
kill命令,直接在后面加pid即可。如果遇到结束不了的进程时,可以在kill后面加一个选项,即kill -9 [pid]。
二、变量
环境变量PATH,他是shell预设的一个变量。通常,shell预设的变量都是大写的。变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。有了PATH这个变量,我们运行某个命令时,就不再需要输入全局路径,直接输入命令名即可。可以使用echo命令显示变量的值。
1.env:
使用env命令,可列出系统预设的全部系统变量。
登录不同的用户,这些环境变量的值也不同。当前显示的是root账户的环境变量。
2 HOSTNAME :表示当前主机的名称。
2 SHELL :表示当前用户的shell类型。
2 HISTSIZE :表示历史记录数。
2 MAIL :表示当前用户的邮件存放目录。
2 PATH :该变量决定了shell将到哪些目录中寻找命令或程序。
2 PWD :表示当前目录。
2 LANG :这是与语言相关的环境变量,多语言环境可以修改此环境变量。
2 HOME :表示当前用户的家目录。
2 LOGNAME :表示当前用户的登录名。
env命令显示的变量只是环境变量。
2.set:
set命令和env命令类似,也可以输出环境变量。
set命令不仅可以显示系统预设的变量,也可以显示用户自定义的变量。
虽然可以自定义变量,但是该变量只能在当前shell中生效。
使用bash命令可以再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来shell,myname变量还在。
让设置的环境变量一直生效
允许系统内所有用户登录后都能使用该变量。
仅允许当前用户使用该变量。
在Linux下设置自定义变量的规则:
v 设定变量的格式为a=b,其中a为变量名,b为变量内容,等号两边不能有空格。
v 变量名只能由字母、数字以及下划线组成,而且不能以数字开头。
v 当变量内容带有特殊字符(如空格)时,需要加上单引号。
有一种情况需要注意,就是变量内容中本身带有单引号,这时就需要加双引号。
如果变量内容中需要用到其他命令,运行结果则可以使用反引号。
变量内容可以累加其他变量内容,但需要加双引号。
如果不小心把双引号加为单引号,则得不到你想要的结果。
使用双引号时,不会取消双引号中特殊字符本身的作业(这里是$),而使用单引号时,里面的特殊字符将全部失去本身的作用。
使用bash命令,如果当前shell中运行bash指令,则会进入一个新的shell,这个shell就是原来shell的子shell。使用pstree指令来查看。
在父shell中设定变量后,进入子shell时,该变量是不会生效的。如果想让这个变量在子shell中生效,则要用到export指令。
export命令就是声明一下这个变量,让该shell的子shell也知道变量abc的值是123。设置变量之后,如果想取消某个变量,只要输入unset变量名即可。
三、系统环境变量与个人环境变量的配置文件的配置文件
1. /etc/profile :这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。
2. /etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符。
\u指用户,\h指主机名,\w指当前目录,\$指字符#(如果是普通用户,则显示为$)。
除了以上两个系统级别配置文件外,每个用户的主目录下还有以下几个隐藏文件。
3. .bash_profile :该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
4. .bashre :该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时该文件会被读取。例如,你可以将用户自定义的自定义的别名或者是自定义变量写道这个文件中。
5. .bash_history :该文件用于记录命令历史。
6. .bash_logout :当退出shell时,会执行该文件。你可以将一些清理的工作放到这个文件中。
四、Linux shell中的特殊符号
1. * :
代表零个或多个任意字符。
2. ? :
只代表一个任意字符。
3. # :
注释符号,这个符号在Linux中表示注释说明,即#后面的都会被忽略。
4. \ :
脱义字符,这个字符会将后面的特殊符号(如 * )还原为普通字符。
5. | :
管道符,作用是将前面命令的输出作为后面命令的输入。后面的命令,并不是所有的命令都可以,,一般针对文档操作的命令比较常用。例如cat、less、head、tail、grep、cut、sort、wc、uniq、tee、tr、split、sed、awk等,其中grep、sed和awk是正则表达式必须掌握的工具。
wc -l用来计算一个文档有多少行。
(1) cut :cut命令用来截取某一个字段,其格式为cut -d ‘分隔字符’ [-cf] n ,这里n是数字。
-d:后面跟分隔字符,分隔字符要用单引号括起来。
-c:后面接的是第几个字符。
-f:后面接的是第几个区块。
-d选项后面加冒号作为分隔字符,-f 1表示截取第一段,-f和1之间的空格可有可无。
-c选项后面可以是一个数字,也可以是区间n1-n2,还可以是多个数字n1、n2和n3。
(2) sort :sort命令用作排序,其格式为sort [-t 分隔符] [-kn1,n2] [-nru] ,这里n1和n2指的是数字。
-t:后面跟分隔字符,作用跟cut的-d选项一样。
-n:表示使用纯数字排序。
-r:表示反向排序。
-u:表示去重复。
-kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即只对n1字段排序。
ü 如果sort不加任何选项,则从首字符向后一次按ASCII码值进行比较,最后将他们按升序输出。
ü -t选项后面跟分隔符,-k选项后面跟单个数字表示对第几个区域的字符串排序,-n选项则表示使用纯数字排序。
ü -k选项后面跟数字n1和n2表示对第n1区域和n2区域内的字符串排序,-r选项则表示反向排序。
这里的-k3,5表示对第3区域至第5区域间的字符串排序。
(3) wc :wc命令用于统计文档的行数、字符数或词数。
-l:统计行数
-m:统计字符数
-w:统计词数
如果wc不跟任何选项,直接跟文档,则会把行数、词数和字符数依次输出。
(4) uniq :uniq命令用来删除重复的行。
-c:表示统计重复的行数,并把行数写在前面。
使用uniq前,必须先给文件排序,否则不管用。
(5) tee :tee命令后面跟文件名,其作用类似于重定向>,但他比重定向多一个功能,即把文件写入后面所跟的文件时,还显示在屏幕上。该命令常用于管道符|后。
(6) tr :tr命令用于替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的符号^M。
-d:表示删除某个字符,后面跟要删除的字符。
-s:表示删除重复字符。
tr命令常用于把小写字母改成大写字母,如tr ‘[a-z]’ ‘[A-Z]’ 。
tr命令还可以替换一个字符
不过替换、删除以及去重复等操作都是针对一个字符来讲的,由一定的局限性。如果是针对一个字符串,就不能再使用了。
(7) split :split命令用于切割文档。
-b:表示依据大小来分隔文档,单位为byte。
如果split不指定目标文件名,则会以xaa、xab...这样的文件名来存取切割后的文件。也可以指定目标文件名。
-l:表示根据行数来分割文档。
6. $ :
符号$可以用作变量前面的标识符,还可以和!组合起来使用。
!$表示上条命令中的最后一个变量。
7. ; :
如果想在一行中运行两个或两个以上的命令,需要在命令之间加符号; 。
8. ~ :
符号~表示用户的家目录,root用户的家目录是/root,普通用户则是home/username。
9. & :
如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况,比如,sleep后。
10. >、>>、2>和2>> :
重定向符号>和>>,他们分别表示取代和追加的意思。当我们运行一个命令报错时,报错信息会输出到当前屏幕。如果想重定向一个文本,则要用 重定向符号2>或者2>>,他们分别表示错误重定向和错误追加重定向。
11. [] :
中括号内为字符组合,代表字符组合中的任意一个,可以是一个范围(1-3,a-z)。
12. &&和|| :
分号可作为多条命令间的分隔符,其实还有两个可以用于命令中间的特殊符号,那就是&&和||。
使用;时,不管command1是否执行成功,都会执行command2.
使用&&时,只有command1执行成功后,command2才会执行,否则command2不执行。
使用||时,command1执行成功后则command2不执行,否则执行command2,即command1和command2中总有一条命令会执行。
只有当ls test2成功执行后才会执行touch test2。因为test2不存在,ls test2没有执行成功,所以&&后面的touch test2并没有执行。
若ls test2执行不成功,则会执行touch test2。因为test2不存在,ls test2没有执行成功,转而执行||后面的touch test2,使用增加了test2这个文件。
原文:https://www.cnblogs.com/ko-no-dio-da/p/14070019.html