什么是shell?

        shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序,命令和程序可以理解成我们图中的应用程 序,我们linux系统中的那些命令其实也都是一个个的小程序,只不过完成的是系统的应用功能。我们在系统的终端中输入一条命令,可以立马看到一条或者几 条系统回复我们的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫 作交互的方式,相当于我们在和电脑交流。Shell存在于系统的最外层,所以算作操作系统的外壳,它之外的应用程序就不能算作操作系统了。我们从输入系统的账户密码开始,到登录系统以后的所有操作都是shell在帮我们解释执行的。

在 Android shell 中构建并进入 debian 环境 拷贝文件_子程序

基本上shell分两大类:

一:图形界面shell(Graphical User Interface shell 即 GUI shell)

例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。

二:命令行式shell(Command Line Interface shell ,即CLI shell)

例如:

bash / sh / ksh / csh(Unix/linux 系统)

交互式shell和非交互式shell

  1. 交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
  2. shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

什么是shell脚本?

        如果我们的命令或者应用程序不在命令行直接执行,而是通过一个程序文件来执行时,这个程序就被称之为shell 脚本。Shell脚本里面通常内置了多条命令,有的还包含控制语句,比如if和else的条件控制语句,for和select的循环控制语句等。这些内置 在一个shell脚本中的命令通常是一次性执行完成,不会不停的返回信息给用户,这种通过文件执行脚本的方式是非交互方式。

为什么要使用shell脚本?

       使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。或者可以归纳成以下三点:

  • 简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
  • 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
  • 开发容易:可以在短时间内完成一个功能强大又妤用的脚本

shell脚本的执行方式

最常见的脚本执行方式sh /mnt/test.sh,shell会开启一个子程序执行脚本

适用范围:脚本文件本身没有可执行权限(即文件权限属性x位为-号),或者脚本文件开头没有指定解释器时需要使用的方法。

在 Android shell 中构建并进入 debian 环境 拷贝文件_Shell_02

或者chmod +x /mnt/test.sh给sh权限,直接运行脚本的幻数

适用范围:脚本有执行权限,允许调用子程序执行脚本

在 Android shell 中构建并进入 debian 环境 拷贝文件_shell脚本_03

在 Android shell 中构建并进入 debian 环境 拷贝文件_shell脚本_04

/mnt/test.sh=./test.sh,也可以用./test.sh执行

在 Android shell 中构建并进入 debian 环境 拷贝文件_Shell_05

source /mnt/test.sh  这种执行方式不会开启任何子程序

适用范围:加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令

在 Android shell 中构建并进入 debian 环境 拷贝文件_Shell_06

source test.sh=. test.sh,同样用. test.sh也不会开启任何子程序

在 Android shell 中构建并进入 debian 环境 拷贝文件_子程序_07

shell脚本执行方式的区别(面试题):

在 Android shell 中构建并进入 debian 环境 拷贝文件_shell脚本_08

在 Android shell 中构建并进入 debian 环境 拷贝文件_子程序_09

在 Android shell 中构建并进入 debian 环境 拷贝文件_shell脚本_10

题目:a=1,如何在脚本中直接调用a

我们对比了一下五种脚本运行方式,发现只有source test.sh和. test.sh两种运行方式可以输出a的值

这是因为source test.sh和. test.sh是在当前shell里面运行的没有调用子程序,所以它们可以获取a的值

而其它shell脚本运行方式都调用了子程序执行脚本,所以无法获取当前shell里a的值