Shell基础
1、什么是Shell
linux中Shell就是外壳的意思,是用户和系统交互的接口。它提供用户与内核进行交互操作的一种接口,它接受用户输入的命令并将其送入到内核去执行。
实际上shell是一个命令解释器。拥有自己内建的Shell命令集。我们在命令提示符下输入的命令都由Shell先接收并进行分析,然后传给Linux内核执行。结果返回给Shell并在屏幕上显示。同时,shell又是一种程序设计语言,允许我们编写由Shell,命令组成的程序,这种程序通常称为Shell脚本或命令文件。
总的来说,Linux中Shell主要提供以下几种功能:
1、解释用户命令行提示符下输入的命令。
2、提供个性话的用户环境,通常由Shell初始化配置文件(如.profile、.login等)实现。
3、编写Shell脚本,实现高级管理。
2、使用Shell
Ubuntu默认使用的Shell程序是bash。使用以下指令可以查看当前使用的Shell类型。
如果安装了多种Shell程序,要改变当前Shell程序,只需在命令行中输入Shell名称即可,需要推出Shell程序,执行exit命令即可,我们可以嵌套进入多个shell,然后使用exit命令逐个推出。
3、正则表达式
正则表达式是一种可以用于模式匹配和替换的工具,通过正则表达式,Shell可以使用一系列的特殊字符构建匹配模式,然后将匹配模式与待比较字符串或文件进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
1、通配符
通配符用于模式匹配,如字符串查找、文件名匹配与搜索。常用通配符有以下几种:
*:匹配任何字符和任何数目的字符组合,例如,*log*表示含有log的字符串。
?:匹配任何单个字符,例如,a?c表示由a、任意字符和b组成的字符串。
[ ]:表示一个字符序列,字符序列可以包括若干字符,例[abc]表示a、b、c之中的任一字符。
!:在[]中使用!表示排除其中任意字符,如[!ab]表示不是a或b的任一字符。
^"具有两重含义:开始标记和非,如:/^a/表示以a开始的字符,当在[]中时:/[^a]/表示非a的所有字符。
$:只在尾行匹配字符串,它放在匹配单词的后面。例如:linux$表示以单词linux结尾的所有文件。
2、模式表达式
模式表达式是那些包含一个或多个通配符的字符串,各模式之间以竖线(|)分开。bash除支持上述通配符外,还提供了以下特有的扩展模式匹配表达式。
*:匹配任意多个模式。例如,file(.c|.o)只匹配file.c、file.o、file.o.c等。
+:匹配一个或多个模式。例如,file+(.c|.o)匹配文件file.c、file.o、file.o.c、file.c.o等。
?:匹配模式表中一个给定模式。例如,file?只匹配file.c,file.o,file等,不匹配file.o.c、file.c.o等。
@:仅匹配模式表中一个给定的模式。例如,file@(.c|.o)只匹配file.c,file.o,但不匹配file、file.c.c、file.c.o等 。
!:除给定模式表中的一个模式之外,它可以匹配 其它任何字符串。
在实际使用时,模式表达式可以递归,即每个表达式中可以包含一个或多个模式。例如file*(.[echo]|.sh)。
4、Shell的特殊字符
Shell中除了使用普通字符外,还可以使用特殊字符,应注意其特殊的含义及作用范围。通配符前面已经讲过了。
1、引号
在Shell中的引号有3种,即单引号、双引号和反引号。
(1) 由单引号('')括起来的字符串为普通内字符串,包括空格、$、/、\等特殊字符。
(2) 由双引号(" ")括起来的字符串,除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。
“$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号"`"表示命令替换;
仅当“\”后面的字符是下述字符之一时,“\”才是转义字符,这些字符是:“$”、“`”、“"”、“\”或换行符。转义字符告诉Shell不要对其后面的那个字符进行特殊处理,只是当作普通字符。
(3)倒引号括起来的字符串被shell解释为命令行,在执行时,Shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。在前面示例中已经见过。
2、其他符号
常见的其他符号有#(注释)、\(跳转符号,将特殊字符或通配符还原成一般字符、|(分隔两个管道命令)、;(分隔多个命令)、/~(用户主组目录)、$(变量前需要加的变量值)、&(将给符号前的命令放到后台执行),具体使用将在后面介绍。
5、环境变量
每个用户登录系统后,都会有一个专用的运行环境。通常各个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。我们可直接引用环境变量,也可修改环境变量来定制运行环境。常用的环境变量有PATH(可执行命令的搜索路径)、HOME(用户主目录)、LOGNAME(当前用户的登录名)、HOSTNAME(主机名)、PS1(当前命令提示符)、SHELL(用户当前使用的shell)等。
使用env命令可显示所有的环境变量。
要引用某个环境变量,在其前面加上$符号,如要查看当前用户主目录,执行以下命令:
要修改某个环境变量,则不用加上$符号,如默认历史命令记录数量为1000,要修改它(变量名为HISTSIZE),只需在命令行中为其重新赋值。例如
5、命令行输入与输出
与DOS类似,Shell程序通常自动打开三个标准文档:标准输入文档(stdin)、标准输出文档(stdout)和标准出错文档(stderr).其中stdin一般对应终端的键盘,stdout和stderr对应终端屏幕。进程从stdin获取输入内容,将执行结果信息输出到stdout,如果有错误信息,同时输出到stderr.多数情况下使用标准输入输出作为命令的输入输出,但有时可能要改变标准输入输出,这里就涉及到重定向问题了。
1、输入重定向
输入重定向主要用于改变命令的输入源,让输入不要来自键盘,而来自指定文件。基本用法:
command {<} [File] {<<} [Word]
这里的 <
与 <<
意义不是类似于输出重定向的操作符,<
是从文件中取出数据到指定的文件中。
示例:
wc命令用于统计制定文件包含的行数、字数和字符数,直接执行不带参数的wc命令,将等待用户输入内容之后,按<Ctrl>+<D>结束输入后才对输入的内容进行统计。而执行下列命令通过wc命令提供统计源:
2、输出重定向
主要用于改变命令的输出,让标准输出不要显示在屏幕上,而是写入到指定文件中,基本用法:
command [OPTION]{>,>>} [File] option: 1 standard output(default) 2 standard error output & all output
>
为覆盖输出,>>
为追加输出
示例:ls命令在屏幕上列出文件列表,不能保存列表信息。,要将结果保存到指定文件,即可使用输出重定向,下列命令将当前目录中的文件列表写入到制定文件的末尾。
如果要写入已有文件,则将该文件重写(覆盖)。要避免重写破坏原有数据,可选择追加功能,将>改为>>,下命令当前目录中的文件列表信息追加到指定的文件的末尾。
cat 命令直接使用的话可以直接接收键盘的输入
以上是对标准输出来讲的,至于错误输出的重定向,只需要换一种符号,将>改为2>,将>>改为2>>。将标准输出和标准错误输出重定向到同一文件,则使用符号&>。
3、管道
管道用于将一个命令的输出作为另一个命令的输入,使用"|"符号来连接命令。可以将多个命令依次连接起来,前一个命令的输出作为另一个命令的输入。基本用法:
命令1|命令2 ....|命令n
示例:以下命令将ls命令的输出提交给grep命令进行搜索。
·在执行内容较多的命令时,可以通过使用more命令进行分页显示,例如:
4、命令替换
命令替换与重定向有些类似,不同的是命令替换是将一个命令的输出作为另一个命令的参数,常用的命令格式如下:
命令1`命令2`
其中命令2的输出作为命令1的参数,被反引号括起来的内容作为命令执行,执行的结果作为命令1的参数。
示例:以下命令将pwd命令列出的目录作为
6、执行Shell脚本
Shell脚本是指使用Shell所提供的语句所编写的命令文件,又称为Shell程序,Shell脚本可以包含任意从键盘输入的linux命令。Shell脚本最基本的功能就是汇集一些命令行输入的连续指令,将它们写入脚本中,然后直接执行脚本来启动一连串的命令行指令,如用脚本定义防火墙规则或者执行批处理任务。如果经常用到相同执行顺序的操作命令,就可以将这些命令写成脚本文件,以后要进行同样的操作,只需要在命令行输入该脚本文件名即可。
执行Shell脚本最常用的方式是将Shell脚本的权限设置为可执行,然后在提示符下直接执行它。直接编辑生成的脚本文件是没有执行权限的,如果要将Shell脚本直接当作命令执行,就需要利用命令chmod将它置为具有执行权限。例如:
chmod +x example
这样就可以像执行linux命令一样来执行脚本文件,执行Shell脚本的方式与执行一般的可执行文件的方式相似。Shell接收用户输入的命令,并进行分析。如果文件被标记为可执行,但不是被编译过的程序,Shell就认为它是一个脚本。Shell将读取其中的内容,并加以解释执行。