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将读取其中的内容,并加以解释执行。

 

参考资料:

Linux Shell

shell中的引号

inux 输入输出(I/O)重定向

shell中的重定向(输入输出)

 Linux重定向和管道

posted @ 2018-04-01 10:51  noticeable  阅读(217)  评论(0编辑  收藏  举报