linux基础学习笔记四:带你认识一下shell

一、什么是Shell?

  • 由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。你看,在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢?用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell

  • Shell 是一个应用程序,它连接了用户Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ迅雷Firefox 等其它软件没有什么区别。然而 Shell也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell来使用 Linux,不启动 Shell的话,用户就没办法使用 Linux。

二、什么是shell脚本?

  • Shell既是一种命令语言,又是一种程序设计语言,而后者就是我们平时说的shell脚本。

  • Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python等常见的编程语言并没有什么两样。Shell虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:if...else选择结构,case...in开关语句,forwhileuntil 循环;变量、数组、字符串、注释、加减乘除、逻辑运算等概念;函数,包括用户自定义的函数和内置函数(例如 printfexporteval等)。站在这个角度讲,Shell也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。尤其是 Linux 运维工程师,Shell更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

  • 任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。Shell就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

三、Shell 是如何连接用户和内核的?

  • Shell能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 Shell 的认知。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?!

  • 其实,Shell程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。

  • 接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。比如,我们都知道在 Shell中输入cat log.txt命令就可以查看 log.txt文件中的内容,然而,log.txt放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell统统不知道的,它只能去调用内核提供的 open()read()函数,告诉内核我要读取 log.txt 文件,请帮助我,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。

在这里插入图片描述

四、Shell 还能连接其它程序

  • Shell 中输入的命令,有一部分是 Shell本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令

  • Shell 本身支持的命令并不多,功能也有限,但是 Shell可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是Shell的功能非常强大,完全能够胜任Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

  • 更加惊讶的是,Shell还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

  • 大家所说的 Shell强大,并不是 Shell本身功能丰富,而是它擅长使用和组织其他的程序。Shell就是一个领导者,这正是 Shell的魅力所在。

可以将 Shell 在整个Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是Shell,通过Shell才能运行其它的应用程序。
在这里插入图片描述

五、Shell 种类

  • Shell编程跟 JavaScriptphp编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

  • Linux 的 Shell种类众多,常见的有:

    Bourne Shell/usr/bin/sh/bin/sh
    Bourne Again Shell/bin/bash
    C Shell/usr/bin/csh
    K Shell/usr/bin/ksh
    Shell for Root/sbin/sh

我们平时见的比较多的是Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。在一般情况下,人们并不区分 Bourne ShellBourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

我们可以通过以下命令来查看自己的shell:
在这里插入图片描述

六、Shell 脚本的4种执行方式

  • 工作目录执行:指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本
  • 绝对路径执行
[tan@tan scripts]$ pwd
/home/tan/scripts
[tan@tan scripts]$ `pwd`/test.sh 
Hello Shell
[tan@tan scripts]$ /home/tan/scripts/test.sh 
Hello Shell
  • sh执行:指的是用脚本对应的shbash来接着脚本执行。这种方法可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)
[tan@tan scripts]$ sh test.sh 
Hello Shell
[tan@tan scripts]$ bash test.sh 
Hello Shell
  • shell环境执行:指的是在当前的shell环境中执行,可以使用 .接脚本或 source接脚本
[tan@tan scripts]$ . test.sh 
Hello Shell
[tan@tan scripts]$ source test.sh 
Hello Shell

参考链接

https://www.jb51.net/article/161001.htm

http://c.biancheng.net/view/706.html

具体的语法,可以参考以下两个教程

https://www.runoob.com/linux/linux-shell.html

http://c.biancheng.net/shell/

posted @ 2020-04-29 13:55  耐心的小黑  阅读(51)  评论(0编辑  收藏  举报