shell脚本基础

Shell基础知识

前言:

Shell脚本在日常的Linux系统管理中是必不可少的。在学习shell脚本之前,需要你了解很多的相关知识,这些知识是编写shell脚本的基础。

1. 什么是shell

Shell是系统跟计算机硬件交互时使用的中间介质,它是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西--系统内核,接着内核再去支配计算机硬件取值执行各种操作。

① 记录命令历史

我们执行过的命令都会记录,预设可以记录1000条历史命令。这些命令保存 在用户的家目录的.bash_history文件中。

!是与命令历史有关的一个特殊字符,该字符常用的应用有三个:

!!:连续两个!表示执行上一条命令。

 

!n:这里的n是数字的,表示执行命令历史中的第n条指令。

 

!字符串(字符串大于等于1):

 

② 命令和文件的补全

最开始我们就用tab键帮我们补全一个指令、一个路径或者一个文件名。连续 按两次tab键,系统则会把所有的命令或者文件名列出来。

③ 别名

之前我们见过alias,它也是bash所特有的的功能之一。我们可以通过alias把一个常用的并且很长的指令另取名为一个简单易记的指令。如果不用了还可以使用unalias解除别名功能。直接执行alias命令,会看到目前系统的预设别名。

 

我们也可以自定义命令的别名,格式:alias[命令别名]=[具体的命令]

 

④ 通配符

bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符。

 

⑤ 输入/输出重定向

输入重定向用于改变命令的输入,输入重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果重输入到文件中,而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>。另外,还有错误重定向命令2>以及追加重定向命令>>

 

⑥ 管道符

例:cat /etc/passwd|wc -l

⑦ 作业控制

Ctrl+Z:当运行进程时,这个组合键可以使它暂停

fg:可以恢复进程,使暂停的程序恢复

bg:使进程到后台运行

Jobs:查看多个任务

Killkill   pid 直接杀死进程,遇到杀不死的进程就用 kill  -9  pid

 

2. 变量

① 系统环境变量命令env:可列出系统预设的全部系统变量:

 

登录不同的用户,这些环境变量的值也不同。当前显示的是root账户的环境 变量。下面列举一些常见的环境变量。

HOSTNAME:表示主机的名称

SHELL:表示当前用户的shell类型

HISTSIZE:表示历史记录数

MAIL:表示当前用户的邮件存放目录

PATH:该变量决定了shell将到哪些目录中寻找命令或程序

PWD:表示当前目录

LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量

HOME:表示当前用户的登录名

LOGNAME:

② 命令set:把系统预设的全部变量都显示出来

 

使用bash命令可以再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shellmyname变量还在。如果想让设置的环境变量一直生效,分以下两种情况。

允许系统内所有用户登录后都能使用该变量。具体操作:在/etc/profile文件的最后一行加入export myname=wanghongjun,然后运行 source /etc/profile就生效了。再运行bash,命令或者切换用户就可以看到效果。

 

仅允许当前用户使用该变量。具体操作:在主目录下的.bashrc文件的最后一行加入,然后运行就可以生效了,这里source的作用是将目前设定的配置刷新,即不用注销再登录也能生效。

设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格。

l 变量名只能由字母、数字以及下划线组成,而且不能以数字开头

l 当变量,内容带有特殊字符(如空格)时,需要加上单引号。

 

² 有一种情况需要注意,就是变量内容中本身带有单引号,这时就需要加双引号了。

 

² 如果变量内容中需要用到其他命令,运行结果则可以用反引号。

 

² 变量内容可以累加其他变量的内容,但需要加双引号。

 

² 如果你不小心把双引号错加为单引号,则得不到你想要的结果。

 

3. 与个人环境变量的配置文件

/etc/profile:这个文件主要预设几个重要的变量,例如:PATH USER LOGNAMEMAILINPUTRCHOSTNAME HISTSIZE umask等。

/etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符。

.bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。

.bashrc:该文件包含专属于自己的shellbash信息,当登录或每次打开新的shell时,该文件会被读取。

.bash_history:该文件用于记录命令历史

.bash_logout:当退出shell时会执行该文件。你可以将一些清理的工作放到这个文件中。

4. Linux shell中的特殊符号

① *代表零个或多个任意字符

② ?只代表一个任意的字符

③ 注释符号#:表示注释说明,#后面的内容都会被忽略

 

④ 脱义字符\:字符后面的特殊符号(如*)还原为普通字符

 

⑤ 再说管道符|:将前面的命令的输出作为后面命令的输入。

⑥ 命令cut:用来截取某一字段,格式:cut  -d 分隔字符[-cf] n,这里n指数字。

-d:后面跟分隔字符,分隔字符要用单引号括起来。

-c:后面接的是第几个字符。

-f:后面接的是第几个区块。

 

-d选项后面加冒号作为分隔字符,-f1表示截取第一段,-f1之间的空格可有可无

 

-c选项后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1n2n3

 

⑦ 命令sort:用做排序,格式:sort[-t分隔符][-kn1,n2][-nru],这里n1n2指的是数 字。

-t:后面跟着分隔字符,作用跟cut-d选项一样。

-n:表示使用纯数字排序。

-r:表示反向排序。

-u:表示去重复。

-kn1n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。

  • 如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。

 

  • -t选项后面跟分隔符,-k选项后面跟单个数字表示对第几个区域的字符串排序,-n选项则表示使用纯数字排序。

 

  • -k选项后面跟数字n1n2表示对第n1n2区域内的字符串排序,-r选项则表示反向排序。     

 

这里的-k3,5表示对第3区域至第5区域间的字符串排序。

⑧ 命令wc:用于统计文档的行数、字符数或词数。该命令常用项:-l(统计行数)、-w(统计词数)、-m(统计字符数)。

 

这里wc不跟任何选项,直接跟文档,则会把行数、词数、字符数依次输出。

⑨ 命令uniq:用于删除重复的行,该命令-c选项常用,它表示统计重复的行数,并把行数写在前面。

使用前先给文件排序

 

⑩ 命令tee:后面跟文件名,作用类似于重定向>,但它比重定向多一个功能,即把文件写入后面所跟文件时,还显示在屏幕上。该命令常用于管道符|后。

 

⑪ 命令tr:用于替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的符号^M。该命令常用项有以下两个:

-d:表示删除某个字符,后面跟要删除的字符。

-s:表示删除重复的字符。

tr命令常用于把小写字母变成大写字母,如tr[a-z]’’[A-Z]

 

tr命令还可以替换一个字符

 

⑫ 命令split:用于切割文档,常用选项为-b-l

-b:表示一句大小来切割文档,单位byte

 

如果split不指定目标文件名,则会以xaaxab……这样的文件名来存取切割后的文件。我们也可以指定目标文件名

 

-l:表示依据行数来分割文档

 

⑬ 特殊符号$:可用作变量前面的标识符,还可以和!结合起来使用。

 

⑭ 特殊符号;  :通常我们都是在一行中输入一个命令,然后回车就运行了,如果在一行中运行两个号或者两个以上的命令,就需要在命令之间加;。

 

⑮ 特殊符号~:表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username

 

⑯ 特殊符号&:把一条命令放到后台执行。它通常用于命令运行时间较长的情况,可用在sleep

 

⑰ 重定向符号>>>2>2>>:前俩命令表示取代和追加的意思。当运行命令报错时,报错信息会输入到当前屏幕。如果想重定向到一个文本,则要用重定向符号2>2>>,他们分别表示错误重定向和错误追加重定向。

 

⑱ 中括号[]:内为字符组合,代表字符组合中的任意一个,可以是一个范围(1-3a-z)。

 

⑲ 特殊符号&&||:可用于多条命令的中间特殊符号。

command1;commamd2

command1&&commamd2

command1||commamd2

使用;时,不管command1是否执行成功,都会执行commamd2

使用&&时,只有command1执行成功后,commamd2才会执行,否则commamd2不执行。

使用||时,command1执行成功后则commamd2不执行,否则执行commamd2,即command1commamd2中总有一条命令执行。

例:

 

本例中,只有当ls test2成功执行后,才会执行touch test2。因为test2不存在,ls test2没有执行成功,所以&&后面的 touch test2并没有执行。

 

本例中,若ls test2执行不成功,则会执行touch test2。因为test2不存在,ls test2没有执行成功,转而执行||后面的 touch test2,所以增加了test2这个文件。

posted on 2021-04-28 19:26  程序猿-拾柒  阅读(252)  评论(0)    收藏  举报

导航