什么是shell.docx
- 文档编号:17895867
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:43
- 大小:62.64KB
什么是shell.docx
《什么是shell.docx》由会员分享,可在线阅读,更多相关《什么是shell.docx(43页珍藏版)》请在冰点文库上搜索。
什么是shell
第7章什么是Shell
6.1内核(kernel)与Shell
我们经常听到操作系统内核这个词,那么什么是操作系统的内核呢?
内核这个词起源于UNIX,在UNIX的设计中首先使用了层次结构的设计,这种结构将操作系统的组成程序按照他们对于系统的重要性和对于具体设备的依赖性划分为几个层次,其中作为系统最为核心,独立于具体硬件设备和软件资源的部分就称之为内核。
这是操作系统中最稳定,也是最基本的部分。
内核控制具体硬件设备的工作:
它有责任解释基本指令并将其送到处理器,并负责运行和调度进程、分配内存以及执行所有的输入输出。
内核是UNIX系统的心脏,内核有且只有一个。
在UNIX后设计的各种主流操作系统中,如我们现在正在学习的Linux操作系统 ,也都使用了这种先进的设计。
在了解了内核的概念之后,我们就可以更清楚地理解Shell的作用了。
坚果的壳保护其内部的核,同样一个LinuxShell提供一个外设的保护层。
为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳,也就是我们常说的Shell。
图6-1描述了用户、Shell、内核与硬件设备之间的层次关系。
在整个系统中,“硬件”是实体工作者;控制硬件进行工作的是“核心”;而用户正是利用“Shell”与内核进行沟通,来操控硬件进行正确的工作。
用户
图6-1用户、Shell、内核及硬件的层次关系
6.2什么是Shell
Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。
它为用户提供了一个向Linux内核发送请求以便运行程序的接口系统级程序,是用户使用Linux的桥梁,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell本身是一个用C语言编写的程序 。
它既是一种命令语言,又是一种程序设计语言。
作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
它虽然不是Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。
因此,对于用户来说,Shell是最重要的实用程序,深入了解和熟练掌握Shell的特性及其使用方法,是用好Linux系统的关键。
那么,Shell是何时启动,又如何进行工作的呢?
在系统启动的时候,内核程序会被加载到内存,负责管理系统的工作,直到系统关闭为止。
它建立并控制着处理程序,管理内存、文件系统、通讯等等。
而其它的程序,包括Shell程序,都存放在磁盘中。
内核程序将它们加载到内存,执行它们,并且在它们终止后清理系统。
Shell是一个公用程序,它在我们登陆后启动,并提示我们输入命令。
当用户使用Linux时是通过命令来完成所需工作的。
一个Linux命令,如ls、cd等,就是用户和Shell之间对话的一个基本单位。
在我们键入一个命令后,接着就是Shell的工作了,它会进行:
1.语法分析命令列 ;
2.处理万用字符(wildcards)、转向(redirection)、管道(pipes)与工作控制(jobcontrol);
3.搜寻并执行命令。
每个Linux系统中有许多不同版本的Shell,每个用户可以拥有他自己的用户接口或Shell,用以满足他们自己专门的Shell需要。
除字符界面以外,Linux还提供了像MicrosoftWindows那样的可视的命令输入接口--XWindow的图形用户接口(GUI)。
它提供了很多窗口管理器,其操作就象Windows一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。
现在比较流行的窗口管理器是KDE和GNOME。
在使用Linux的过程中,如果我们经常输入一组相同形式的命令,我们就会想要自动执行那些命令。
这时,我们可以将这组命令放入一个文件中,这个文件就称为命令文件(script) ,又叫做脚本。
在以后的章节中,我们会陆续介绍一些脚本编写的例子。
6.3Shell变量
为使Shell编程更有效,系统提供了一些Shell变量。
Shell变量可以保存诸如路径名、文件名或者数字等变量名,还可以定制用户本身的工作环境。
使用变量可以保存有用信息,使系统获知用户相关设置;变量还可用于保存暂时信息。
Shell可以定义两种变量:
本地变量和环境变量。
除此之外,还有两种特殊变量,它们是只读的,用于向Shell脚本传递参数,我们分别称之为位置变量参数和特定变量参数。
6.3.1本地变量
本地变量是只能在用户的当前Shell中使用的变量,是Shell私有的。
它们在当前Shell的进程内部创建,但不会传递给由该Shell创建的任何子进程。
在任何时候,例如,本地变量file-name取值为test.txt,这个值只在用户当前Shell生命期有意义。
如果在Shell中启动另一个进程或退出,此值将无效。
这种变量的优点就是用户不能对其他的Shell或进程设置此变量有效。
6.3.1.1变量的设置
我们在表6-1中列出了变量设置的不同模式。
命令
说明
variable-name=value
设置实际值value到变量variable-name
variable-name+value
如果设置了变量variable-name,则重设其值为value
variable-name:
?
value
如果未设置变量variable-name,显示未定义用户错误信息,并设其值为value
variable-name?
value
如果未设置变量variable-name,显示系统错误信息,并设其值为value
variable-name:
=value
如果未设置变量variable-name,则设置其值为value;如果已设置,则保存原值
variable-name:
-value
同上,但是取值并不设置到variable-name,可以被替换
表6-1变量设置的不同模式
在设置变量值时,应该遵循以下规则:
等号两边可以有空格,但等号两边不能直接接单独的空格符。
变量名只能是英文字母与数字,但是数字不能是开头字符。
如果变量所取的值中包含空格,必须使用双引号“”或单引号‘’将变量取值括起来;双引号和单引号的不同之处在于,双引号内的特殊字符可以保有变量的特性,但是单引号内的特殊字符则仅为一般字符。
必要时需要用‘\’来将特殊符号(如Enter,$,\,空格,'等)变成一般符号;
Shell变量用大写或小写字母均可。
通常来说,大写字母为系统预设的变量,而小写字母通常用于用户自定义的变量,方便判断。
如果设置变量时,不想再改变其值,可以将之设置为只读方式。
只读方式的设置格式如下:
variable-name=value
readonlyvariable-name
设为只读方式后,如果有人包括用户本人想要改变它,都会返回错误信息。
要查看所有只读变量,直接使用命令readonly即可。
在使用变量时,也可以用花括号将之括起来。
这样做虽然不是必需的,但可以有效的防止Shell误解变量值。
例如要设置一个本地变量,$variable-name=value可以写成:
${variable-name=value}
如果一个变量没有值,我们就说它含有空值,这是变量行没有赋值时的默认状态。
如果要想显示的给变量赋予空值,通过给变量赋予什么也没有的值就可以实现,就像:
variable-name=
也可以在=后面用一对紧挨着的引号,如:
variable-name=“”
或
variable-name=‘’
它们的作用也都是给variable-name赋空值。
注意:
以引号方式给变量赋空值时,要注意两个引号必须紧挨着,中间不可以有空格。
如果其间有空格,那么赋给变量的就不是空值,而是空格字符了。
6.3.1.2显示及清除变量命令:
echo、set和unset
1.显示指定变量取值:
echo
【命令说明】
使用echo命令可以显示单个变量取值。
【命令格式】
echo$variable-name或者echo${variable-name}
其中variable-name是要显示的变量名。
$字符是Shell的特殊字符,如果$后跟一个合法的变量名,Shell会把它当作在此处用变量所存储的值来替换的指令。
【实例说明】
实例6.1 用echo命令显示指定变量取值
$name=aa
$echo${name}
aa
$testname="$nameistotest"
$echo$testname
aaistotest
$testname='$nameistotest'
$echo$testname
$nameistotest
说明:
在本例中,第一条命令设定变量name的取值为aa。
第二条命令用echo察看变量name的取值,得结果aa。
第三条命令设置变量testname的值,由于其取值中间有空格,因而用双引号括起来。
双引号内的字符可以保留变量的特性,而变量name的值又为aa,因而在第四条命令显示变量testname值时,结果为:
aaistotest。
第五条命令将同样的内容赋给testname ,不同的是这次的取值用单引号括起来。
由于单引号不能保留变量的特性,因而在第六条命令显示testname值时,结果为:
$nameistotest。
2.显示所有本地定义的Shell变量:
set
【命令说明】
echo 命令用于显示单个变量或指定的某一变量的取值,而set命令用于显示所有本地定义的Shell变量。
【命令格式】
set
set命令的使用方式就是直接输入:
set。
3.清除变量:
unset
【命令说明】
unset命令用于清除已设置的变量。
【命令格式】
unsetvariable-name
其中variable-name是要清除的变量名。
【实例说明】
实例6.2 用unset命令清除变量
$name=aa
$echo$name
aa
$unsetaa
$echo$name
$
说明:
在本例中,一开始设置变量name的值为aa,后用unset命令清除变量name,这样再用echo命令显示name的值时,由于已被清除,也就是说name含有的是空值,因而将不显示任何值,并出现Shell提示符$提示输入下一条命令。
6.3.1.3读入变量值命令:
read
【命令说明】
read语句用于从键盘或文件的某一行文本中读入信息,并将其赋给指定变量。
【命令格式】
readvariables
其中variables是要读入的变量名,可以一次读入多个变量值,各变量值之间用空格隔开。
当执行这一命令时,Shell从终端读入一行数据,并把所读入的第1个字段赋给variables中所列的第1个变量,第2个字段赋给variables中所列的第2个变量,以此类推。
如果读入的词数比比变量个数多,则多出的词一同赋给最后一个变量。
【实例说明】
实例6. 用read命令交互式读入变量值
首先,我们用命令read读入变量var1、var2、var3的值:
$readvar1var2var3
Hellomyfriends
然后使用echo命令显示var1、var2、var3的值:
$echo$var1$var2$var3
Hellomyfriends
可见,三个字段Hello、my、friends已分别赋给了var1、var2、var3。
那么,我们如果读入多于三个的字段,会有什么结果呢?
$readvar1var2var3
Hellomydearfriends
$echo$var3
dearfriends
由于输入多余变量时,输入值余下的内容会全部赋给最后一个变量,因而var3的值就成了dearfriends。
如果读入少于三个的字段呢?
$readvar1var2var3
Hellofriends
$echo$var3
$
由于var3为空,因而不显示任何内容而直接回到命令提示符状态。
6.3.1.4变量的其它应用
1.变量值的结合
将变量并排可以使变量结合在一起。
具体格式为:
echo${variable-name1}${variable-name2}…….
【实例说明】
实例6.3 变量值的结合
$firstname="Jacky"
$surname="CHANG"
$echo${firstname}${surname}
JackyCHANG
2.使用变量来保存系统命令参数
我们可以用变量保存系统命令参数的信息,并将其应用到系统命令中去。
【实例说明】
实例6.4 使用变量来保存系统命令参数
$source="/etc/passwd"
$dest="/root/passwd_bak"
$cp${source}${dest}
说明:
在本例中,我们用变量来保存文件拷贝的文件名信息,并将其应用到拷贝命令中。
变量source保存passwd文件的路径,dest保存cp命令中文件目标。
这样一来,就可以就变量名source和dest来替换cp命令中的原文件路径和目标文件路径了。
6.3.2环境变量
环境变量是可以用于所有进程的变量。
它与本地变量有所不同:
本地变量只能用于当前 Shell的进程,而不会传递给该Shell产生的任何子进程;而环境变量可由父进程传递给子进程,再由子进程传递给孙进程 ……这样一直传下去,它可以用于所有进程,包括编辑器、脚本和应用。
6.3.2.1环境变量的设置、显示和清除
1.环境变量的设置
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在.profile文件中定义。
系统管理员可能在/etc/profile文件中已经设置了一些环境变量。
普通用户还可以在其主目录下的.profile文件中对环境变量进行设置,如增加新的变量或覆盖/etc/profile的设置。
将环境变量的设置放入.profile文件意味着每次登录时这些值都将被初始化。
环境变量与本地变量设置方式基本相同。
传统上,所有环境变量均为大写。
需要注意的是,在将环境变量应用于用户进程前,必须将设置的环境变量导出。
因为如果不进行导出操作,该环境变量将无法应用于子进程。
以下介绍两种导出环境变量的方法:
第一种,也是最常用的一种,是用export命令进行导出。
另一种方法是在.profile文件中使用set命令的-a选项,指明所有变量都将直接被导出。
set–a命令一般只在各用户主目录的.profile文件中使用,而不用在/etc/profile中。
【命令格式】
方法1.用export命令导出:
variable-name=value ;exportvariable-name
其中variable-name是要设置的变量名,value是变量的取值。
变量设置命令和export命令之间用分号隔开。
或者也可以这样写:
variable-name=value
exportvariable-name
方法2.用set命令的-a选项导出:
set–a
variable-name1=value1
variable-name2=value2
......
只需在所有设置的变量前加入set–a命令,就可将全部这些设定的变量值导出了。
2.环境变量的显示和清除
与本地变量一样,环境变量也可以用echo命令来显示,用unset命令来删除。
其用法与本地变量的相同,在此就不再赘述了。
与本地变量不同的是,环境变量还可以用env命令来进行显示:
【命令说明】
env命令可用于查看所有的环境变量。
【命令格式】
env
env命令的使用方式就是直接输入:
env。
这时系统中所有设置的环境变量都将显示出来。
6.3.2.2嵌入Shell变量
一般说来,Shell中都有一些预留的环境变量名,这些变量名各自都具有其固定的用途,且不能用作其他用途,称为嵌入Shell变量。
通常情况下,这些嵌入的环境变量是在 /etc/profile中建立的,但用户也可根据自己的习惯在其他路径下建立。
用户还可以根据自己的需要对这些变量值的设置进行修改。
以下是一些主要的嵌入Shell变量:
CDPATH:
改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。
如果设置了CDPATH,那么在用cd命令进入一个目录时,将首先查找CDPATH,如果CDPATH中包含此目录,则此目录成为当前工作目录。
EXINIT:
用于保存使用vi编辑器的一些初始化选项。
HOME:
用于保存用户主目录的完全路径名。
设置了HOME目录之后,可以简单的使用cd命令进入它,也可以用$cd$HOME进入。
IFS:
IFS用作Shell指定的缺省域分隔符。
域分隔符可以是任意字符,缺省的域分隔符通常设置为空格、新行或tab键,以便于区分。
LOGNAME变量与USER变量:
用于保存登录用户名。
缺省值为当前用户名。
MAIL:
MAIL变量保存邮箱的路径名,缺省为:
/var/spool/mail/
Shell周期性的检查新邮件,如果有了新邮件,在命令行会出现一个提示信息,这时我们就可以到MAIL变量所设置的路径下去查收邮件。
MAILCHECK:
保存Shell检查新邮件的时间间隔,缺省值为60,也即每60秒检查一次新邮件。
MANPATH:
保存系统上man文本所在的的目录列表。
不同的目录间用冒号分隔。
PATH:
PATH变量保存存放命令或脚本的目录路径名,不同的目录路径名之间用冒号分隔开。
当输入一个命令或脚本时,Shell会按照PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
因而,PATH变量所给出的的目录次序就显得很重要,正确的排列这些目录可以节省执行命令的时间。
通常情况,最好把HOME目录下的路径放在最前面,接下来是从最常用到一般使用再到不常用的目录路径次序。
如果是在当前工作目录下查询,无论在哪儿,均可以使用句点‘.’来表示当前目录。
PATH变量可以在系统目录下/etc/profile中设置,也可以使用下面方法加入新的查找目录:
$PATH=$PATH:
filelist;exportPATH
其中,filelist表示要加入的查找目录列表,不同目录路径之间要用冒号分隔开来。
PS1:
主提示符。
在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。
PS2:
辅助提示符。
在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分。
默认的辅助提示符是>。
PWD:
当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
SHELL:
SHELL变量用于保存用户所使用的Shell的类型。
在设置SHELL变量的值时,指定Shell类型是用其所在的绝对路径表示出来的。
TERM:
TERM变量保存终端类型。
设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有vt100、vt200、vt220-8等。
6.3.3位置变量参数
位置变量参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数,它们常用于向系统命令及一些Shell脚本传递信息。
参数从第一个开始,在第九个结束,第九个以后的参数都不会被访问,除非我们用shift命令改变此限制;每个访问参数前要加$符号,各参数之间用空格分隔。
执行程序时,取当前Shell程序的文件名替换程序文件中的$0,程序名后的第一个参数替换程序文件中的$1,第二个替换$2,依次类推。
例如,若一个名为Param的Shell程序传送Ilikeverymuchthisfilm的信息,下面的表6-2列出了如何访问每一个参数:
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
Param
(程序名)
I
like
very
much
this
film
表6-2位置变量参数的访问方法示例
在实例6.5中,我们将具体介绍怎样将位置变量参数Ilikeverymuchthisfilm应用到Shell脚本Param中。
【实例说明】
实例6.5 位置变量参数的使用
$catParam
# !
/bin/sh
#Param
echo"Thisisthescriptname:
$0"
echo"Thisisthefirstparameter:
$1"
echo"Thisisthesecondparameter:
$2"
echo"Thisisthethirdparameter:
$3"
echo"Thisisthefourthparameter:
$4"
echo"Thisisthefifthparameter:
$5"
echo"Thisisthesixthparameter:
$6"
echo"Thisistheseventhparameter:
$7"
echo"Thisistheeighthparameter:
$8"
echo"Thisistheninthparameter:
$9"
$ParamIlikeverymuchthisfilm
Thisisthescriptname:
./Param
Thisisthefirstparameter:
I
Thisisthesecondparameter:
like
Thisisthethirdparameter:
very
Thisisthefourthparameter:
much
Thisisthefifthparameter:
this
Thisisthesixthparameter:
film
Thisistheseventhparameter:
Thisistheeighthparameter:
Thisistheninthparameter:
说明:
在Shell脚本Param中,前两行用#标注的内容为注释,其中第一行# !
/bin/sh表明该脚本使用的Shell类型,第二行说明该脚本的文件名。
从第三行echo开始的部分为程序正文。
由执行结果我们可以看到,由于Param文件名后跟了六个单词,因而只传递6个参数,第7、8、9个参数皆为空,正像表6-2中展示的那样。
6.3.4特定变量参数
特定变量参数用于传递Shell程序运行时的一些相关控制信息。
常见的特定变量有7个,它们的具体意义见表6-3。
特定变量名称
意义
$#
表明传递到脚本的参数个数
$*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 什么是 shell