查看原文
其他

shell编程 --- Shell入门介绍

小秋 苦逼的码农 2019-01-22

排好队,跟我一起涨知识


什么是Shell?Shell的中文意思是“外壳”,至于啥是Shell,你确定你真的知道?今天,我们就来谈谈,什么是Shell,它是干嘛的,有哪些优点…


首先说说Shell、内核与硬件的关系

当我们要让计算机为我们做一件事情的时候,其实真正帮我们把事情给完成好的是硬件这个家伙。例如,当你要计算 a + b = ?的时候,我们都知道是通过各种电路、芯片等的配合来完成的。硬件这个家伙虽然干活强,但是头脑可能并不是很管用,计算a+b这些指令的时候,它并不知道执行的顺序

这个时候内核就出场了,它指挥着硬件如何工作。也就是说,用户输入一段命令,内核根据这条命令来指挥硬件如何工作。不过很遗憾,内核这家伙藏的比较深,用户是很难与内核直接沟通的。内核管理的东西太多了,拥有的权力太大了,如果用户叫内核干嘛,内核就干嘛的话,万一用户一不小心胡乱操作,可能会导致操作系统奔溃的。

说这么多,其实就是想说用户一般情况下用户无法与内核直接交流。

这个时候,Shell就出场了,也就是说,用户输入命令,Shell对用户输入的命令进行解释,然后提交给内核,内核再指挥硬件正确着工作。

这就是这三个家伙的关系。如下图:

其实用户想要通过计算机来完成某些工作,总不能直接来操作系统吧?但用户又必须通过操作系统来完成我们的任务。这个时候用户一般是通过所谓的应用程序来操作内核,然后让内核来指挥硬件。我们都知道,应用程序在操作系统中是处于最外层的,就像鸡蛋的外壳一样,因此也就被称之为Shell    

也就是说,Shell的功能只是为用户操作系统提供一个接口。只要能够操作应用程序的接口我们都称之为Shell。侠义的Shell指的是命令行类的软件。广义的Shell还保存那些图形界面的软件。

学习Shell有哪些好处呢

有些人可能会觉得现在已经有好多图形界面的工具可以来操作我们的系统了,为啥还要学习Shell呢?其实Shell的优点多到数不清,我就暂时列举几个。

  • 与图形界面相比,Shell命令行下的执行效率更高,不信你打开你window下的命令行去删除一个软件试试。

  • 学了Shell,装逼也高格了,当然指的是装给外行人看,如果有个女同学叫你帮个忙,你用命令行来操作她的电脑,分分钟成为她的大神。

  • 功能更加强大,有些操作可能在图形界面不好操作,说个简单的,例如你想查看你电脑端口的监听情况等,用命令行分分钟的事。

  • 可以远程操作Linux服务器,这个可以说用的可多的,通过远程工具来操作你的服务器,你总不能要求用界面的来操作吧?

好吧,我就不在列举了。总之,作为一个程序员,学点Shell是必须的。

Shell的种类

虽然一直说是Shell,但是Shell有挺多种的。例如Bourne Shell(sh), Sun里头默认的C Shell, 商业上常用的K Shell等。每一个Shell都有各自的特点,语法上也有一些差别。Linux里使用的这一种版本就称之为”Bourne Again Shell(简称bash)”,这个是Bourne Shell的增强版,算是用的人比较多。还有那个C Shell因为语法与C类似,因此也比较出名,用的人也比较多。  不过我们讲的主要以bash为主。

bash有哪些功能?

Linux是使用bash这个shell这个默认的shell的,那它有哪些功能呢?,下面我就列举它的一些功能

  • 命令记忆能力
    不得不说,命令记忆能力是一个很棒的功能,例如我们可以通过上下按键来找到前后一个输入的命令,这可以让我们进行更高效的操作。而且我们可以通过历史命令来进行排错,当我们系统除问题什么的时候,我们可以通过查看我们的历史命令,看看我们之前都执行了什么命令,来定位出错的原因。
    不过这些命令都被存在哪里呢?其实这个命令就在你的主文件夹内的.bash_history文件里,不过需要注意的是,~/.bash_history记录的是前一次登陆以前所执行过的命令,而这一次登陆所执行的命令都被暂存在内存中,当你成功注销系统后,这些命令才会被记录到.bash_history里。当然,你也可以强行把这些命令更新的.bash_history里。

  • 命令与文件补全功能
    这个功能也是很好用的,可以帮助我们少打些字,也去让我们输入的命令更见准确。例如:
    (1).[tab]接在一串命令的第一个字的后面,则为命令补全
    (2).[tab]接在一串命令的第二个字以后时,则为文件补全
    (3).连续按两次[tab]可以显示所有可以执行的命令,要想系统中有多少以c开头的命令,直接c[tab][tab]。

  • 命令别名的设置(alias)
    给一个命令设置一个别名,可以把指令设置成符号我们习惯的名字,更好的记忆,而且可以把复杂的指令简单化。

  • 程序脚本(shell script)
    通过Shell来写一个脚本,可以更方便我们执行工作,例如我们可以把进行需要连续用到的命令写成一个脚本文件。

当然,bash的功能还有很多,以上只是列举几个。

下面我们看看内置命令与外部命令

在我们执行的命令中,有一些是shell自带的,我们称之为内置命令,而有些命令则是程序员们为了更方便这工作,加进去的,我们称之为外部命令。

显然,内置命令的执行速度更快。内置命令是当我们登陆系统时,内置命令就被装入内存了,而外部命令则时只有在被调用时,才被装入内存。

例如,当我们输入一个命令,系统会先判断该命令是内置命令还是外部命令。如果是内置命令,则直接调用执行,否则会根据用户给出的路径或者系统环境变量中查找该命令,找到的话把它装入内存,然后在进行调用执行。说白了,外部命令其实就是一个可执行文件。

我们可以通过type命令来查看该命令是内置命令还是外部命令。

type [-tpa] name

参数:

不加任何参数时,type会显示出name是外部命令还是内置命令或是别名
-t:  加了-t后会以如下字眼显示它的意义:
  file:表示为外部命令。
  alias:表示该命令为命令别名所设置的名称
  builtin:表示为内置命令
-p:  如果给出的命令是外部命令,则显示其绝对路径
-a:在环境变量”PATH”指定的路径中,显示给定命令的信息,包括别名、路径。

测试用例如下所示:

vi为外部命令,cd为内置命令





今天讲到这里勒。下一篇讲Shell中的变量

推荐阅读:
Linux大人养成计划1—-基础命令总结
Linux达人养成计划2—-虚拟机下的网络配置
Linux达人养成3—使用远程工具操作Linux
Linux养成达人4——一些相对有趣点的网络命令

感谢你的阅读,希望对你有所帮助,分享更多需要的人勒。
欢迎关注我的公众号:苦逼的码农
每天推送技术文章,各种资源以及每日一题 有关面试的算法题

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存