2023年11月27日发(作者:)

第四章 Shell的使用 知识点

Edit by LCHSH

1. 什么是Shell

Shell是一个系统程序,在前台提供Linux系统与用户交互操作的界面;另外一方面Shell

是一个命令的编译解释器,会将用户命令经过编译和解释后,交给内核进行执行,也就是说

将用户命令解释为系统和内核可以理解和识别的机器语言。

我们目前所使用的操作系统实际上是一个核心(内核Kernel作为使用者无法直接对

内核(Kernel)进行操纵,而是通过内核的“外壳程序”来与内核进行沟通,这个外壳程序

因此得名,实际上就是Shell

Shell是使用者与系统的一个互动界面,主要是要使用者通过命令行来完成工作,所以

Shell的定义就是命令的编辑解释器:将使用者的命令翻译给核心;将核心处理结果翻译给

使用者。

当用户登录的时候,就获得了一个Shell

Shell和内核实际上是不同的两套软件:不同的操作系统上可以使用不同的Kernel,而

相同的操作系统上也可以使用不同的Shell

2. Shell有哪些种类?

Bsh:是Bourne Shell的简称,是较早的UNIX Shell程序,实现了基本的Shell程序

功能,除了承担命令解释器的功能外,Bsh还是编程语言。

Csh:是C Shell的缩写,使用C语言的语法风格。CshBsh相比,更加适合于用

户命令交互。

Ksh:结合了BshCsh两者的功能优势,兼有Bsh的语法和Csh的交互特性。

Bash:是Bsh的升级替代品。是GNU项目的成员,也是著名的开源软件项目。大

多数Linux发行版本都使用Bash作为默认的Shell,当运行Shell程序时,系统实际运行的

Bash程序。

3. 各种Shell之间如何切换?

系统启动后,默认运行的是Bash

bsh(运行Bsh,此时的BshBash的子shell

exit(退回到Bash

csh(运行Csh,此时的CshBash的子shell

exit(退回到Bash

4. 如何更改用户帐户的Shell

使用chsh命令可以更改帐户的Shell

useradd teacher(创建用户帐户teacher

passwd teacher(为teacher帐户设置密码)

grep teacher /etc/passwd(列出passwd文件中所有包含有字符串“teacher”的行)

teacher:x:500:500:teacher:/home/teacher:/bin/bash(可以看到,teacher帐户用的是Bash

chsh teacher更改帐户teachershell可以键入/bin/bshteacherShell改为Bsh

新的Shell并不马上生效,将在用户下一次登录系统时生效。

5. 什么是变量?变量的作用是什么?

所谓的变量,就是利用一个特定的“名称”(变量名)来存储可以变化的“值”

变量的作用在于存储环境参数和保存Shell的信息。变量里的值可以在与用户的交互操

作中被用户读取使用。

6. Shell变量可以分为哪些类型?

可以分为:环境变量、预定义变量、位置变量、自定义变量(本地变量)四种类型。

7. 什么是环境变量?

环境变量是用户登录时Linux系统为用户预先设定好的一类Shell变量。其功能是设置

用户在当前Shell中的工作环境,包括用户宿主目录、命令查找路径、用户当前目录等。

环境变量具有如下特点:

环境变量的名称不使用小写字母。

环境变量在Linux系统中拥有固定的含义,因此环境变量的名称是固定的。

环境变量的初使值在用户登录后就已经存在,并可以被其他命令读取和使用。

环境变量的值通常由Linux系统自动维护,无需用户人工设置。

环境变量中的值会随着用户状态的改变而改变,用户可以通过读取环境变量了解自

己的当前状态。

8. 如何查看系统中都有哪些Shell变量?

set命令用于显示系统中的所有的各类型的Shell变量,但其中大多数是环境变量。

set | more(分屏显示当前用户全部Shell变量的名称和变量的值)

9. 如何查看某一个具体的变量的值?

使用echo命令,此命令的参数为变量名前面加上“$”符号,这样就可以查看到变量中

存储的值。

echo $PATH(查看环境变量PATH中的值)

10. 常用的环境变量有哪些?

USER:存储的是当前帐户的帐户名。

UID:存储的是当前用户帐户的用户号。

SHELL:存储的是当前用户登录时所使用的Shell

HOME:存储的是当前用户的宿主目录。

PWD:存储的是用户当前所在的目录。

PATH存储的是当前用户的命令搜索路径,即用户输入命令而不指定命令文件的路

径时,Shell程序将在哪些目录中进行该命令程序的搜索。

PS1:主提示符,在特权用户下,缺省的主提示符是#;在普通用户下,缺省的主提

示符是$

PS2Shell接收用户输入命令的过程中,如果用户在输入行末尾输入然后回车,

或者当用户按回车继续输入命令的其余部分,缺省的辅助提示符是>

11. 用户的环境变量是如何设置的?

Shell的大部分环境变量是在用户登录启动shell之后就存在并且有了初值了,那么,这

些变量及其初值是如何设置出来的呢?系统是通过一系列的环境变量配置文件设置这些环

境变量的。作为root用户可以修改这些文件从而对用户的环境变量进行定制。

环境变量配置文件可分为全局配置文件和用户配置文件两种。

环境变量全局配置文件包括“/etc/profile”和“/etc/bashrc”两个文件,Linux系统中所

有的用户在登录时都会按照全局配置文件的内容设置工作环境。/etc/profile文件负责设置

全局的环境,适用于所有的用户的登录;/etc/bashrc”文件用于定义全局的函数和别名。

在执行完上述配置文件之后,bash会执行登录用户宿主目录下的“.bash_profile”文件

和“.bashrc”文件。通过这两个配置文件设置用户个性化的环境变量。在这里的设置可以覆

盖上述两个配置文件的设置。这两个文件的作用分别类似于全局的“/etc/bashrc”文件和

/etc/bashrc”文件。

12. 什么是位置变量?

Shell程序执行过程当中,shell可以通过位置变量来获得用户在命令行上附加的参数。

位置变量共有九个,从$1$9,分别标识了用户输入的整个命令行中以空格分隔开的字符

串,$1表示第一个参数,$2表示第二个参数,依此类推。

$0代表所执行命令的名称,虽然$0与位置变量的格式相同,但是$0属于预定义变量而

不是位置变量。

13. 什么是预定义变量?

预定义变量是Shell内部已经定义好的变量,其值是由Shell根据系统环境的变化自动

赋值,不能进行手工更改。所有预定义变量都是由$符号加上另外一个符号组成,用户通过

他们可以获得当前脚本程序的运行信息,常用的预定义变量有:

$# 表示位置参数的数量。

$* 表示所有位置参数的内容。

$? 表示命令执行后返回的状态,返回0表示成功执行,其他表示错误执行。

$$ 表示当前进程的进程号。

$! 表示后台运行的最后一个进程号。

$0 表示当前执行的进程名称。

预定义变量通常使用在Shell脚本中,在Shell交互命令中并不常使用,但是仍然可以

使用“echo”命令查看预定义变量的值。

echo $$(查看当前进程的进程号)

14. 什么是用户自定义变量?

用户自定义变量是Shell用户自己定义的变量,只在用户自己的Shell中有效,因此又

称为本地变量。自定义变量能够实现更加灵活的功能,因此自定义变量也是用户最常使用的

一类变量。

自定义变量的设置

DAY=sunday(给自定义变量DAY赋值为sunday

自定义变量的查看

echo $DAY(查看自定义变量DAY的值)

自定义变量的输出

用户在自己的Shell中定义了某个变量后,只能在当前的Shell中使用这个变量,而在

当前Shell的子Shell中是无效的。可以用export命令把用户自定义变量输出为全局变量,

就可以在子Shell中引用这个变量了。

export DAY(将自定义变量DAY声明为全局变量)

自定义变量的清除

unset DAY(清除自定义变量DAY

15. Bash有哪些常用功能?

命令的补全功能:当用户输入某条命令时,可以只输入命令名中开始部分的字符,

然后使用Tab键进行命令的补全。

目录名、文件名的补全功能:利用Tab键,在已经输入的路径中,对文件和目录名

进行匹配查找,从而补全。

命令功能功能:该功能可以让用户快速地重复地执行已经输入过的命令。

history(显示Bash中保存的所有历史命令,在本命令的执行结果中,每个用过的历

史命令占1行记录,前面标有行号)

#!22(执行历史命令中的第22条命令)

#!his(执行历史命令中前三个字符是“his”的那条命令)

history c(清空历史命令)

为了提高系统的安全性,可以将“history -c”命令添加到“.bash_logout”文件(此文件

是用户注销时执行的脚本)中,这样每次用户退出Shell时都会自动将用户的历史命令列表

清空。

别名功能:该功能可以把频繁使用的复杂命令定义为简单的别名命令,简化了命令

的输入。

alias benet=mount t iso9660 /dev/cdrom /media/cdrom/(定义别名命令“benet

alias benet(查看别名命令“benet”的内容)

benet(执行别名命令,进行光盘的挂载)

当自定义的别名命令与系统中的命令重名时,该命令执行时,系统调用执行的是别名命

令。

unalias benet(取消别名命令“benet

用户定义的别名,只在当前用户Shell环境中有效,下次重启动后,定义的别名将消失,

因此,用户固定使用的自定义别名命令应保存在用户宿主目录的“.bashrc”文件中。

系统定义的别名命令,保存在“/etc/profile.d/”目录中的配置文件中,这些配置文件,

在每次用户登录时,用来配置用户的环境,因此,用户用“unalias”命令取消的系统定义的

别名,在下次启动后,会恢复回来。

16. 输入输出的种类有哪些?

Linux系统中对所有的设备都通过文件的形式来引用,而每一个文件在Linux系统内核

中都分配一个文件描述符(非负整数)

标准输入:固定的0号文件描述符被分配给标准输入文件stdin通常对应终端的

键盘。

标准输出:1号文件描述符分配给标准输出文件(stdout,通常对应终端的屏幕。

标准错误:2号文件分配给标准错误输出文件(stderr,也对应终端的屏幕。

shell在启动时会打开012三个标准输入输出文件,在用户执行命令没有指定输入

输出文件时,缺省使用这3个输入输出文件来读写信息。

17. 什么是输入重定向?

输入重定向就是将某命令接收输入的途径由默认的键盘更改为指定的文件,即改变了命

令的输入源。

输入重定向需要使用“<”重定向操作符。

wc < myfile(把文本文件myfile中的内容做为键盘的输入,交给wc命令进行处理)

18. 什么是输出重定向?

输出重定向是将命令的输出结果定向到指定的文件中,而不输出到标准输出文件(显示

器)中。

输出重定向需要使用“>”和“>>”重定向操作符。

ls /etc/ > myfile(把ls命令的输出结果,保存到myfile文件中)

ls /dev/ > myfile(把ls命令的输出结果,覆盖保存到myfile文件中)

ls /bin/ >> myfile(把ls命令的输出结果,插入保存到myfile文件中)

19. 什么是错误重定向?

当我们输入错误的命令时,系统提供的错误提示信息将显示在屏幕上,可以将这些错误

信息重定向到指定的文件。

错误重定向需要使用“2>”重定向操作符。

nocmd 2> errfilenocmd”是一条不存在的命令,键入该命令后,系统会出现错误提

示信息,把这些提示信息保存到errfile文件中)

20. 输出重定向和错误重定向如何组合使用?

如果需要将标准输出和错误输出重定向到同一个文件,需要使用“&>”重定向操作符。

例,在当前目录中,有文件afileallfile,执行下面的命令:

ls afile bfile &> allfile

将标准输出和错误输出同时重定向到了文件allfile中。(因为有afile文件,所以有标准

的输出结果;因为没有bfile文件,所以要报错)

21. 什么是管道?

通过管道符“|”,可以把多个简单的命令连接起来,实现复杂的功能。

管道符左边的命令的执行结果,作为管道符右边的命令的操作源。

ls /etc/ | head -2(显示出/etc/目录下的文件列表中的前两行)

ls /etc/ | grep net(显示出/etc/目录下的文件列表中带有字符串“net”的行)

22. 什么是Shell脚本?

Shell脚本程序类似于DOS中的批处理文件,Shell命令语句的集合,用于实现特

写的功能。

Shell脚本程序保存在文本文件中,可以使用文本处理程序进行阅读和编辑。

Shell脚本程序是由Shell环境解释执行的,不需要在执行前进行编译。

执行Shell程序时,Shell脚本文件需要具有可执行的属性。

23. 编写一个完整可运行的Shell脚本需要哪些步骤?

建立Shell脚本文件。

vi (创建脚本文件,并打开此文件)

编辑脚本文件,在脚本中输入内容。

#!/bin/bash(表示需要使用Bash对此脚本进行解释执行)

This is my first program.(以“#”开头的句子,是注释语句,即说明信息)

echo Hello World!(用“echo”命令,在屏幕上显示字符串“Hello Word!

存盘退出。

为属主添加文件的可执行属性。

chmod u+x (为属主添加可执行属性)

24. 如何运行脚本程序?

执行脚本程序的方法有三种:

bash命令,调用脚本程序。

bash

用“.”命令,调用脚本程序。

.

直接输入脚本文件名,调用脚本程序。

/home/teacher/