shell脚本基础
l Shell基础知识
前言:
Shell脚本在日常的Linux系统管理中是必不可少的。在学习shell脚本之前,需要你了解很多的相关知识,这些知识是编写shell脚本的基础。
1. 什么是shell
Shell是系统跟计算机硬件交互时使用的中间介质,它是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西--系统内核,接着内核再去支配计算机硬件取值执行各种操作。
① 记录命令历史
我们执行过的命令都会记录,预设可以记录1000条历史命令。这些命令保存 在用户的家目录的.bash_history文件中。
!是与命令历史有关的一个特殊字符,该字符常用的应用有三个:
l !!:连续两个!表示执行上一条命令。

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

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

② 命令和文件的补全
最开始我们就用tab键帮我们补全一个指令、一个路径或者一个文件名。连续 按两次tab键,系统则会把所有的命令或者文件名列出来。
③ 别名
之前我们见过alias,它也是bash所特有的的功能之一。我们可以通过alias把一个常用的并且很长的指令另取名为一个简单易记的指令。如果不用了还可以使用unalias解除别名功能。直接执行alias命令,会看到目前系统的预设别名。

我们也可以自定义命令的别名,格式:alias[命令别名]=[具体的命令]
④ 通配符
在bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符。

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

⑥ 管道符
例:cat /etc/passwd|wc -l
⑦ 作业控制
Ctrl+Z:当运行进程时,这个组合键可以使它暂停
fg:可以恢复进程,使暂停的程序恢复
bg:使进程到后台运行
Jobs:查看多个任务
Kill:kill pid 直接杀死进程,遇到杀不死的进程就用 kill -9 pid

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

登录不同的用户,这些环境变量的值也不同。当前显示的是root账户的环境 变量。下面列举一些常见的环境变量。
l HOSTNAME:表示主机的名称
l SHELL:表示当前用户的shell类型
l HISTSIZE:表示历史记录数
l MAIL:表示当前用户的邮件存放目录
l PATH:该变量决定了shell将到哪些目录中寻找命令或程序
l PWD:表示当前目录
l LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量
l HOME:表示当前用户的登录名
l LOGNAME:
② 命令set:把系统预设的全部变量都显示出来

使用bash命令可以再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shell,myname变量还在。如果想让设置的环境变量一直生效,分以下两种情况。
l 允许系统内所有用户登录后都能使用该变量。具体操作:在/etc/profile文件的最后一行加入export myname=wanghongjun,然后运行 source /etc/profile就生效了。再运行bash,命令或者切换用户就可以看到效果。

l 仅允许当前用户使用该变量。具体操作:在主目录下的.bashrc文件的最后一行加入,然后运行就可以生效了,这里source的作用是将目前设定的配置刷新,即不用注销再登录也能生效。
l 设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格。
l 变量名只能由字母、数字以及下划线组成,而且不能以数字开头
l 当变量,内容带有特殊字符(如空格)时,需要加上单引号。

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

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

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

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

3. 与个人环境变量的配置文件
l /etc/profile:这个文件主要预设几个重要的变量,例如:PATH USER 、LOGNAME、 MAIL、 INPUTRC、 HOSTNAME 、HISTSIZE 、umask等。
l /etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符。
l .bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。
l .bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。
l .bash_history:该文件用于记录命令历史
l .bash_logout:当退出shell时会执行该文件。你可以将一些清理的工作放到这个文件中。
4. Linux shell中的特殊符号
① *代表零个或多个任意字符
② ?只代表一个任意的字符
③ 注释符号#:表示注释说明,#后面的内容都会被忽略

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

⑤ 再说管道符|:将前面的命令的输出作为后面命令的输入。
⑥ 命令cut:用来截取某一字段,格式:cut -d ‘分隔字符’[-cf] n,这里n指数字。
l -d:后面跟分隔字符,分隔字符要用单引号括起来。
l -c:后面接的是第几个字符。
l -f:后面接的是第几个区块。

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

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

⑦ 命令sort:用做排序,格式:sort[-t分隔符][-kn1,n2][-nru],这里n1和n2指的是数 字。
l -t:后面跟着分隔字符,作用跟cut的-d选项一样。
l -n:表示使用纯数字排序。
l -r:表示反向排序。
l -u:表示去重复。
l -kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序。
- 如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将它们按升序输出。

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

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

这里的-k3,5表示对第3区域至第5区域间的字符串排序。
⑧ 命令wc:用于统计文档的行数、字符数或词数。该命令常用项:-l(统计行数)、-w(统计词数)、-m(统计字符数)。

这里wc不跟任何选项,直接跟文档,则会把行数、词数、字符数依次输出。
⑨ 命令uniq:用于删除重复的行,该命令-c选项常用,它表示统计重复的行数,并把行数写在前面。
使用前先给文件排序

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

⑪ 命令tr:用于替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的符号^M。该命令常用项有以下两个:
l -d:表示删除某个字符,后面跟要删除的字符。
l -s:表示删除重复的字符。
tr命令常用于把小写字母变成大写字母,如tr’[a-z]’’[A-Z]’

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

⑫ 命令split:用于切割文档,常用选项为-b和-l
l -b:表示一句大小来切割文档,单位byte

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

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

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

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

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

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

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

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

⑲ 特殊符号&&和||:可用于多条命令的中间特殊符号。
l command1;commamd2
l command1&&commamd2
l command1||commamd2
使用;时,不管command1是否执行成功,都会执行commamd2。
使用&&时,只有command1执行成功后,commamd2才会执行,否则commamd2不执行。
使用||时,command1执行成功后则commamd2不执行,否则执行commamd2,即command1和commamd2中总有一条命令执行。
例:

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

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