隔壁的白富美也在学Shell的本质
文章目录
- 隔壁的白富美也在学Shell的本质
- Shell连接用户和内核
- Shell连接其他程序
- 支持编程的Shell
- 两种类型语言的比较:
- 常见的几种Shell
隔壁的白富美也在学Shell的本质
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
Shell连接用户和内核
Shell 能接收用户输入的命令,并对命令进行处理,处理完命令后再将结果反馈给用户,比如输出到显示器、写入到文件等。你看,我一直都在使用 Shell,哪有使用内核哦?我也没有看到 Shell 将我和内核连接起来呀?
其实,Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 Shell 都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?对!除了函数,你没有别的途径使用内核。
Shell连接其他程序
在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序(一个程序就是一个命令),这叫做外部命令。
Shell 本身支持的命令不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
更加厉害的就是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。
由此可见Shell的功能强大之处并不是本身,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。
可以将 Shell 在整个 Linux 系统中的地位描述成下图所示:
注意:由于用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序,所以用户”和“其它应用程序”是通过虚线连接的
支持编程的Shell
Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python 等常见的编程语言差不多。
Shell 虽然没有 C#、Java、Python 等强大,但也支持基本的编程元素,例如:
if…else 选择结构,case…in 开关语句,for、while、until 循环;
变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。
从这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。
使用脚本语言的Shell
在计算机中,任何代码最终都要转换为二进制的形式才能在计算机中执行。
有的编程语言,比如C/C++、GO语言等必须要将所有的代码翻译成二进制形式(也就是生成可执行文件)然后才能执行,因而执行速度更快、效率更高对硬件的要求低。
这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
而有的编程语言,如Shell、python、PHP等,需要一边执行一边翻译不会生成任何可执行文件。用户必须拿到源码才能执行,程序运行后会及时翻译,翻译一部分执行一部分,不用等到所有的代码全部翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
两种类型语言的比较:
语言类型 特点 适用范围
编译性语言 执行速度快、对硬件要求低、保密性好 开发操作系统、大型应用程序等
解释性语言 使用灵活、部署简单、跨平台性好 适合WEB开发以及制作小工具
常见的几种Shell
常见的 Shell 有 sh、bash、csh、tcsh、ash 等。
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh,sh 是第一个流行的 Shell。
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。
tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与接下来讲到的 bash shell 完全兼容。
bash
bash shell 是 Linux 的默认 shell!
bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
第一个Shell脚本
几乎所有编程语言的教程都是从使用著名的“Hello World”开始的,作为中国人要弘扬传统,我的第一个 Shell 脚本也从输出“Hello World”开始。
①打开Linux终端,通过文本编辑器创建一个名字为test.sh的文件。
②给文件输入以下内容:
#!/bin/bash
echo "Hello World !" #这是一条语句
第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置。
第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指显示器)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。
第 2 行的**#及其后面的内容是注释**。Shell 脚本中所有以#开头的都是注释(当然以**#!开头的除外**)。写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,也方便后期自己维护时看懂自己的脚本。
第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell;后面的/bin/bash就是指明了解释器的具体位置。
第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指显示器)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。
第 2 行的**#及其后面的内容是注释**。Shell 脚本中所有以#开头的都是注释(当然以**#!开头的除外**)。写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,也方便后期自己维护时看懂自己的脚本。
③退出保存文件内容
④通过ls -l test.sh查看文件权限
我们会发现文件权限是可读可写,却不可执行,这是因为它只是一个文本文件。当然不能执行喽!
那么接下来我们就要通过chmod 命令来给文件赋予执行的权限
⑤通过命令chmod test.sh给文件赋予可执行权限
执行命令后再次查看文件的权限时发现文件已经可以执行了。
⑥通过命令./test.sh执行脚本
会发现控制台已经打印出来了Hello World !
为什么什么要加这个./呢?是不是有点多余呢?
当我们把./去掉时会发现控制台会打印“command not found”,这又是为什么呢?这是因为在Shell的标准搜索路径( P A T H ) 中 找 不 到 t e s t . s h 因 此 加 上 . / 是 很 有 必 要 的 。 呢 ? 当 我 们 把 . / 去 掉 时 会 发 现 控 制 台 会 打 印 “ c o m m a n d n o t f o u n d ” , 这 又 是 为 什 么 呢 ? 这 是 因 为 在 S h e l l 的 标 准 搜 索 路 径 ( PATH)中找不到test.sh因此加上./是很有必要的。 呢? 当我们把./去掉时会发现控制台会打印“command not found”,这又是为什么呢?这是因为在Shell的标准搜索路径( PATH)中找不到test.sh因此加上./是很有必要的。呢?当我们把./去掉时会发现控制台会打印“commandnotfound”,这又是为什么呢?这是因为在Shell的标准搜索路径(PATH)中找不到test.sh因此加上./是很有必要的。
隔壁的白富美也在学Shell的本质相关推荐
- 一起学shell之(九-2)拼写检查、进程
#----------------------------------------------------------# # ====> 红色字体 -特指煮酒个人所见.加粗则为需要重点注意. # ...
- shell脚本删除冒号空格_从Bash漏洞学Shell脚本(冒号)
前天,爆发了Bash安全漏洞,非常恐怖.在网络上开始飞速传播,附带了非常友好的检测工具. $ env x='() { :;}; echo vulnerable' bash -c "echo ...
- 我们一起来学Shell - 初识shell
文章目录 Shell 的分类 `bash` `csh` `ksh` `tcsh` `sh` `nologin` `zsh` Shell 能做什么 bash 环境变量文件 `/etc/profile` ...
- 【跟晓月学shell脚本】掌握shell脚本变量实战案例
前言 上篇文章我们探讨了shell脚本变量的基本原理和概念,本篇我们基于上面的内容增加一些实战. 如果你还没有学习shell脚本的变量理论,可以点击链接:[跟晓月学shell脚本]掌握shell脚本变 ...
- 【跟晓月学shell脚本】掌握shell脚本变量原理及概念
前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...
- (1)Shell 编程学习 Shell是什么?Shell的浅显原理 为什么要学Shell 及其第一个Shell脚本 CTF角度学习Shell
最近刷CTF题目的时候经常要用到Shell语言,但是自己并没有系统的学习,所以最近花了点时间学习一下,所以重新来梳理一下.对于稍微有一点编程语言基础的同学,能上手Shell其实不需要半小时(甚至更短) ...
- linux 反弹shell(二)反弹shell的本质
0X00 前言 在上一篇文章 Linux反弹shell(一)文件描述符与重定向,我们已经讨论过了反弹shell中最核心也是相对较难理解的部分,那么接下来我们就可以正式借反弹shell的实例分析回顾前一 ...
- 学shell和python哪个难_shell与python的优劣对比到底用哪个
Python相对于shell的优点: (1)Python不需要记忆太多的命令,语法简单,有C基础的人学起来非常容易上手,易于使用.而shell要学的命令太多了,但常用的命令不是太多. (2)Pytho ...
- 运维学shell还是python_运维DBA要不要学python
运维DBA要不要学python 我个人认为是:要 现在 python 在运维 数据库 的工作中主要用在 1.编写一些运维脚本 2.编写运维管理平台 3.研究互联网大厂的运维脚本/工具并应有 特别是运维 ...
最新文章
- html中绝对定位的父级,父元素相对定位,子元素绝对定位
- pip安装ipython_Python -- 关于pip安装Ipython
- 循环: 打印1~10
- 超链接href属性_如何使用标签上的HREF属性制作HTML超链接
- LinuxAndroid笔记-centos7安装adb并链接到雷电模拟器
- 微信公众平台开发教程第21篇-“可信网址”白名单
- 学习OpenGL-ES: 2 - EGL解析
- 为什么c语言没落了,编程语言Go飞速大涨,Delphi走向没落
- 照片放大模糊怎么变清晰,图片无损放大
- c语言输出字符太阳,〖作业〗 C语言程序设计
- OpenStack环境下安装Mistral
- Web_制作页面开场动画并解决自动播放问题
- 有的放矢,Liferay进军数字体验市场
- const和extern用法
- 大数据仓库技术实训任务2
- allegro PCB 检查报告中的Report DangLine以及禁用Antenna vias
- flash ftp 注册码
- 北京非一卡通公司异型卡遭禁
- NEON intrinsic 简易入门指南
- 无人驾驶出租车实行免费制是天上掉馅饼?No, 天下一定没有免费的午餐