Ubuntu Linux操作系统
上QQ阅读APP看书,第一时间看更新

2.3 Shell基础

学习Linux命令行操作,还要了解Linux Shell,Shell可以用来管理计算机的所有资源。

2.3.1 什么是Shell

在Linux中Shell就是外壳的意思,是用户和系统交互的接口。如图2-9所示,它提供用户与内核进行交互操作的一种接口,它接收用户输入的命令并将其送到内核去执行。

图2-9 Linux Shell示意图

实际上Shell是一个命令解释器,拥有自己内建的Shell命令集。用户在命令提示符下输入的命令都由Shell先接收并进行分析,然后传给Linux内核执行。结果返回给Shell,由它在屏幕上显示。不管命令执行结果成功与否,Shell总是再次给出命令提示符,等待用户输入下一个命令。Shell同时又是一种程序设计语言,允许用户编写由Shell命令组成的程序,这种程序通常称为Shell脚本(Shell script)或命令文件。Shell具有普通编程语言的很多特点,简单易学,任何Linux命令都可编入可执行的Shell程序中。

总的来说,Linux Shell主要提供以下几种功能。

● 解释用户在命令行提示符下输入的命令。这是最主要的功能。

● 提供个性化的用户环境,通常由Shell初始化配置文件(如.profile、.login等)实现。

● 编写Shell脚本,实现高级管理功能。

Shell有多种不同版本,按照来源可以分为两大类型。一类是由贝尔实验室开发的,以Bourne Shell(sh)为代表,此类兼容的有Bourne-Agian Shell(bash)、Korn Shell(ksh)、Z Shell (zsh)。另一类是由加州大学伯克莱分校开发的,以C Shell(csh)为代表,与之兼容的有TENEX C Shell(tcsh)。

Shell本身是一个用C语言编写的程序,虽然不是UNIX/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序,建立文件并以并行方式协调各个程序的运行。因此,对于用户来说,Shell是最重要的实用程序,它是使用UNIX/Linux的桥梁,用户的大部分工作都是通过Shell完成的。掌握Shell对使用Linux系统很关键,这里介绍Shell的基本用法,主要是与命令行使用相关的内容,至于Shell的高级用法——编程将在第9章专门讲解。

2.3.2 使用Shell

用户进入Linux命令行(切换到文本界面,或者在图形界面中打开终端)时,就已自动运行一个默认的Shell程序。用户可看到Shell的提示符,用户在提示符后输入一串字符,Shell将对这一串字符进行解释。输入的这一串字符就是命令行。

Ubuntu默认使用的Shell程序是bash。使用以下命令查看当前使用的Shell类型。

  ~$ echo $SHELL   /bin/bash

bash是Bourne Again Shell的缩写,是Linux标准的默认Shell,操作和使用非常方便。它基于Bourne Shell,吸收了C Shell和Korn Shell的一些特性。bash是sh的增强版本,完全兼容sh,也就是说,用sh写的脚本可以不加修改地在bash中执行。

如果安装有多种Shell程序,要改变当前Shell程序,只需在命令行中输入Shell名称即可。需要退出Shell程序,执行exit命令即可。用户可以嵌套进入多个Shell,然后使用exit命令逐个退出。

建议用户使用默认的bash,如无特别说明,本书中的命令行操作例子都是在bash下执行的。bash提供了几百个系统命令,尽管这些命令的功能不同,但它们的使用方式和规则都是统一的。

2.3.3 正则表达式

正则表达式(Regular Expression,RE)是一种可以用于模式匹配和替换的工具。通过正则表达式,Shell可以使用一系列的特殊字符构建匹配模式,然后将匹配模式与待比较字符串或文件进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

1. 通配符

通配符用于模式匹配,如字符串查找、文件名匹配与搜索等。常用通配符有以下6种。

*(星号):表示任何字符串。例如,*log*表示含有log的字符串。

?(问号):表示任何单个字符。例如,a?c表示由a、任意字符和b组成的字符串。

[](一对方括号):表示一个字符序列,字符序列可以直接包括若干字符,例如[abc]表示a、b、c之中的任一字符,也可以是由“-”连接起止字符形成的序列,例如[abc-fp]表示a、b、c、d、e、f、p之中的任一字符。除连字符“-”之外,其他特殊字符在[]中都是普通字符,包括*和?。

!(感叹号):在[]中使用!表示排除其中任意字符,如[!ab]表示不是a或b的任一字符。

^(幂符号):只在一行的开头匹配字符串。如执行命令ls-1.^d”将显示所有的目录。

$(美元符号):只在行尾匹配字符串,它放在匹配单词的后面。例如,linux$表示以单词linux结尾的所有文件。

2. 模式表达式

模式表达式是那些包含一个或多个通配符的字符串,各模式之间以竖线(|)分开。bash除支持上述通配符外,还提供了以下特有的扩展模式匹配表达式。

*:匹配任意多个模式。例如file*(.c|.o)匹配文件file.c、file.o、file.c.o、file.c.c、file.o.c、file等,但不匹配file.h、file.s等。

+:匹配1个或多个模式。例如,file+(.c|.o)匹配文件file.c、file.o、file.o.c、file.c.o等,但不匹配file。

?:匹配模式表中任何一种模式。例如,file?(.c|.o)只匹配file、file.c、file.o等,不匹配file.c.c、file.c.o等。

@:仅匹配模式表中一个给定模式。例如,file@(.c|.o)只匹配file.c和file.o,但不匹配file、file.c.c、file.c.o等。

!:除给定模式表中的一个模式之外,它可以匹配其他任何字符串。

在实际使用时,模式表达式可以递归,即每个表达式中都可以包含一个或多个模式。例如,file*(.[cho]|.sh)是合法的模式表达式。

2.3.4 Shell中的特殊字符

Shell中除使用普通字符外,还可以使用特殊字符,应注意其特殊的含义和作用范围。通配符前面已经介绍过。

1. 引号

在Shell中的引号有3种,即单引号、双引号和反引号。

由单引号(')括起来的字符串视为普通字符串,包括空格、$、/、\等特殊字符。

由双引号(")括起来的字符串,除$、\、单引号和双引号仍作为特殊字符并保留其特殊功能外,其他都视为普通字符对待。\是转义符,Shell不会对其后面的那个字符进行特殊处理,要将$、\、单引号和双引号作为普通字符,在其前面加上转义符\即可。

还有一个特殊引号是反引号(`)。由反引号括起来的字符串被Shell解释为命令行,在执行时首先执行该命令行,并以它的标准输出结果替代该命令行(反引号括起来的部分,包括反引号)。

2. 其他符号

常见的其他符号有#(注释)、\(跳转符号,将特殊字符或通配符还原成一般字符)、|(分隔两个管道命令)、;(分隔多个命令)、/~(用户的主目录)、$(变量前需要加的变量值)、&(将该符号前的命令放到后台执行),具体使用将在涉及有关功能时介绍。

2.3.5 环境变量

每个用户登录系统后,都会有一个专用的运行环境。通常各个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可直接引用环境变量,也可修改环境变量来定制运行环境。常用的环境变量有PATH(可执行命令的搜索路径)、HOME(用户主目录)、LOGNAME(当前用户的登录名)、HOSTNAME(主机名)、PS1(当前命令提示符)、SHELL(用户当前使用的Shell)等。

使用env命令可显示所有的环境变量。

要引用某个环境变量,在其前面加上$符号,如要查看当前用户主目录,执行以下命令。

  zxp@LinuxPC1:~$ echo $HOME   /home/zxp

要修改某个环境变量,则不用加上$符号,如默认历史命令记录数量为1000,要修改它(变量名为HISTSIZE),只需在命令行中为其重新赋值。例如:

  zxp@LinuxPC1:~$ HISTSIZE=1010   zxp@LinuxPC1:~$ echo $HISTSIZE   1010