C语言中文网 - Shell脚本 - 1

news2025/1/10 20:48:30

Shell 既是一个连接用户和 Linux 内核的程序,又是一门管理 Linux 系统的脚本语言。Shell 脚本虽然没有 C++、Python、Java、C# 等编程语言强大,但也支持了基本的编程元素。

第1章 Shell基础(开胃菜)

欢迎来到 Linux Shell 的世界,在真正开始 Linux Shell 编程之前,先让我们简单地了解一下 Shell 的基本知识,以便为我们接下来的学习打下一个好的基础。

学习完本章,你能对 Shell 有一个初步的了解,比如 Shell 是什么,有哪些?Shell 命令是什么?

1. Shell是什么?1分钟理解Shell的概念!

现在我们使用的操作系统(Windows、Mac OS、Android、iOS 等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及离不开图形界面。

然而在计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情;这个时候的计算机还远远谈不上炫酷和普及,只有专业人员才能使用。

图:早期的电脑,都是“黑纸白字”

对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。

换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

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

用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。

Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

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

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 并不是简单的堆砌命令,我们还可以在 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 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。

尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

Shell 是一种脚本语言

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。

这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。

而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。

这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

参考:

1,Shell是什么?1分钟理解Shell的概念!

Shell是什么?1分钟理解Shell的概念! (biancheng.net)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1068155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吃鸡攻略大揭秘!提升战斗力,分享干货!

大家好!我是你们的吃鸡玩家小编。今天我要和大家分享一些关于提高游戏战斗力和分享顶级游戏干货的干货! 首先,我们要提到的是绝地求生作图工具推荐。作为一名吃鸡玩家,你一定想要在游戏中获得更多的优势。绝地求生作图工具是你必备…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 八)

其他状态管理概述 除了前面章节提到的组件状态管理和应用状态管理,ArkTS还提供了Watch和$$来为开发者提供更多功能: Watch用于监听状态变量的变化。$$运算符:给内置组件提供TS变量的引用,使得TS变量和内置组件的内部状态保持同步…

WSL 安装 NVIDIA显卡驱动

文章目录 WSL 安装 NVIDIA显卡驱动本机显卡信息验证安装 WSL 版 Ubuntu 22.04在 WSL 中安装 NVIDIA显卡驱动WSL 安装 NVIDIA显卡驱动 最近在研究一些 AIGC 工具,由于 Windows 加入了 WSL 之后的各种特性,本文记录一下如何在 WSL 的 Linux发行版 中安装 NVIDIA 显卡驱动的步骤,…

力扣第110题 平衡二叉数 c++ 树 深度优先搜索 二叉树

题目 110. 平衡二叉树 简单 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root [3,9,20,null…

车险计算器微信小程序源码 带流量主功能

车险计算器微信小程序源码带流量主功能,可以精准的算出车险的书目,是一个非常实用的微信小程序源码。 简单的计算让你得知车险价值 另外也支持流量主,具体小编也就不多说了,大家自己搭建研究吧。 源码下载:https://d…

nsoftware Cloud SMS 2022 .NET 22.0.8 Crack

nsoftware Cloud SMS 能够通过各种流行的消息服务(包括 Twilio、Sinch、SMSGlobal、SMS.to、Vonage、Clickatell 等)发送、接收和安排 SMS 消息,从而提供了一种简化且高效的消息服务方法。 Cloud SMS 提供单个 SMS 组件,允许通过…

spring源码解析——IOC之bean创建

正文 在 Spring 中存在着不同的 scope,默认是 singleton ,还有 prototype、request 等等其他的 scope,他们的初始化步骤是怎样的呢?这个答案在这篇博客中给出。 singleton Spring 的 scope 默认为 singleton,第一部…

C++11(左值(引用),右值(引用),移动语义,完美转发)

目录 一、左值与左值引用 1、左值 2、左值引用 3、意义 二、右值与右值引用 1、右值 2、右值引用 三、右值引用使用场景和意义 1、右值的分类 2、移动构造 3、移动赋值 四、万能引用 五、完美转发 一、左值与左值引用 1、左值 左值是一个表示数据的表达式(如变量名…

软件设计之抽象工厂模式

抽象工厂模式指把一个产品变成一个接口,它的子产品作为接口的实现,所以还需要一个总抽象工厂和它的分抽象工厂。 下面我们用一个案例去说明抽象工厂模式。 在class中可以选择super类和medium类,即选择一个产品的子类。在type中可以选择产品的…

LomBok的使用,MyBatis的使用(增删改查)

Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要 为类编写getter或equels方法&#xff0c;同时可以自动化日志变量。 结构 pom <?xml version"1.0" encoding"UTF-8"?>…

LLM - FastAPI 搭建简易问答 Server

目录 一.引言 二.辅助函数 1.黑名单 2.清除函数 三.模型函数 1.加载模型 2.生成配置 四.服务部署 1.post - predict 2.get - clean_cache 3.main - run_app 五.总结 一.引言 SFT workflow 微调工作流程 一文中我们介绍了模型微调从数据到最终应用的流程 FastAPI …

C语言 选择(分支)

if 语句&#xff08;分支语句/选择语句&#xff09; 结构&#xff1a; if ( expressio ) statement 如果对 expression 求值为真&#xff08;非0&#xff09;&#xff0c;则执行 statement &#xff1b;否则&#xff0c;跳过 statement 。与 while 循环一样&#xff0c…

推荐两款不错的打字练习网站~

前言 对于写论文或者编程工作&#xff0c; 打字是其中十分耗费体力的一环&#xff0c;如果学会了盲打&#xff0c;那么可以起到事倍功半的作用。为了提高工作效率&#xff0c;我特意在网路上搜寻了大量打字练习的网站&#xff0c;最终发现有两款打字网站十分不错&#xff0c;同…

论文阅读-- A simple transmit diversity technique for wireless communications

一种简单的无线通信发射分集技术 论文信息&#xff1a; Alamouti S M. A simple transmit diversity technique for wireless communications[J]. IEEE Journal on selected areas in communications, 1998, 16(8): 1451-1458. 创新性&#xff1a; 提出了一种新的发射分集方…

搭建环境遇到的坑

office2010装完没法激活&#xff0c;因为没有关闭杀毒软件和防火墙。AWTK designer编译时报这个错&#xff0c;scons按这个方法装之后就好了。 装AWTK designer后&#xff0c;打不开软件&#xff0c;总是闪退&#xff0c;装了VS后就打得开了装IAR时找不到ActivationInfo.txt&am…

abp中iquery类使用orderBy接口功能报错问题

在后端写排序时&#xff0c;当使用如下OrderBy(排序字段)时&#xff0c;只引用System.Linq时如下错误&#xff1a; 只是因为缺少一个引用&#xff1a;System.Linq.Dynamic.Core  在如下类文件中引用 System.Linq.Dynamic.Core  注意&#xff1a;切记不能删掉System.Linq的引…

STM32 CubeMX ADC采集(HAL库)

STM32 CubeMX ADC采集&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX ADC采集&#xff08;HAL库&#xff09;ADC介绍ADC主要特征一、STM32 CubeMX设置二、代码部分三&#xff0c;单通道轮询采样速度总结 ADC介绍 12位ADC是一种逐次逼近型模拟数字转换器。它有多达1…

springboot整合rabbitmq入门(三)

在上一篇文章中介绍了rabbitmq的fanout模式。今天继续学习另一种模式——direct模式。这种模式是rabbitmq的最简单一种模式。 首先创建一个名为helloDirect1的对列 Configuration public class DirectRabbitConfig {Beanpublic Queue directA(){return new Queue("hell…

【翻译】NCLS: Neural Cross-Lingual Summarization

Abstract 跨语言摘要&#xff08;CLS&#xff09;是为不同语言的源文件生成特定语言摘要的任务。现有方法通常将此任务分为两个步骤&#xff1a;摘要和翻译&#xff0c;导致错误传播的问题。为了解决这个问题&#xff0c;我们首次提出了一种端到端的CLS框架&#xff0c;我们称…

淘宝商品销量数据接口,淘宝商品销量数据API接口

淘宝商品销量数据接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上某一商品的销量数据&#xff0c;包括商品的总销量、近期销量、销售趋势等。 该接口的使用方法是&#xff0c;商家先注册淘宝开放平台账号&#xff0c;申请App…