Linux学习第二十六篇--ShellScript基础

2023-10-23 21:10

本文主要是介绍Linux学习第二十六篇--ShellScript基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

我记得在之前的blog里面说过,shell和指令集的关系.现在为了理清楚ShellScript,再次复述一遍.
我们在计算机基础里面了解到,cpu集成了很多完成系统功能的指令集,我们暂且不管他是复杂指令集还是精简指令集,我们只要知道指令集能够调用系统资源就好了.
我们之前学的linux指令(shell)的作用其实就是通过linux的内核来调用一个个指令集来完成我们需要的功能.
那么什么是ShellScript呢?
如果直译的话,那就是Shell脚本,也就是由一系列Shell构成的脚本,通过将不同的shell,有序的组合在一起,实现特定的功能.
个人感觉,shell就好像变成语言里的函数块(方法),我们将逻辑写在shell脚本中,然后通过调用这个脚本,获取或者实现我们想要的结果.

Shell脚本基础

在学习shell脚本之前,先补充一些基础知识,在学习编程的时候,我看过的很多书,在开始都会老生常谈的提到两个名词:解释型语言和编译型语言.
先说一下编译型语言.如果我们学过C语言的话,可能会了解到,我们的C代码在运行之前有一个过程叫做编译,这个过程的作用就是通过C编译器将我们书写的可读的C代码编译为机器可识别的机器码.所以C语言真正执行的是编译后的机器码.
解释型语言则有别于编译型语言,解释型语言在真正执行的时候才会翻译,负责翻译的东西叫做解释器,每执行一个语句他就翻译一次,所以他的效率相对来说比较低.
两种语言可以说是各有利弊吧,编译型语言虽然说编译后运行比较快,但是考虑到不同平台的兼容性,所以说,可能会在切换系统平台的时候,需要再次编译.
解释型语言弥补了这个问题,虽然牺牲了一定的运行效率,但是在切换平台的时候,往往只是切换成对应平台的解释器即可.
我们现在学的shell脚本,其实也是一种解释型语言.shell脚本是一个高级语言,通过我们在脚本头的定义(#! 解释器),我们可以做到在切换系统平台时,不用修改脚本内容,而且他可以通过简洁的方式实现相对较复杂的功能,所以他的开发也比较容易.
和大多数编程语言一样,shellScript按照从上到下,从左至右依次执行的顺序.我们为了增强脚本的可读性和可维护性,还可以通过#内容的形式为脚本添加注释.

传统的语言学习方式HelloWorld

不知为何,在我学习的绝大多数语言中,第一个实例往往都是"hello world".现在学习ShellScript使用的依然是helloword.我们尊重传统,所以,那就写个helloworld压压惊吧.

首先使用vi建一个名叫"hello.sh"的文件.

然后键入如下内容

#! /bin/bash
echo "Hello World!"
然后给该文件添加执行权限并执行.

看起来很简单的样子,这个脚本只有短短的两行代码.


第一行,#! /bin/bash 这一行并不是注释,这一行其实在声明解释该脚本的解释器.

第二行就是脚本的实际内容了,作用很简单,输出一句Hello World!.

就这样,就这么简单,就完成了自己入门的脚本编写.

但是,是不是有点简单的过分了呀..而且,作用太过单一,有木有...

下面玩一个比较好玩的,可以交互的脚本.比如来个简单的计算器?(只有加法).

简单的交互实现加法运算

这个脚本实现的思路也比较简单,就是声明两个整数类型的变量,然后通过read指令获取用户输入,然后做一下简单的变量校验.

然后输出就好了.(请忽略我中式英语版的注释,本来我寻思着想用汉语拼音呢.)


看一下运行效果.


不错....非常666...

对了对了,还有一点,如果我们想要计算两个变量的和,但是不想每个都通过declare -i 来声明,我们可以通过$((计算式))的形式来获取计算结果哟.

比如:



但是,其实到这儿,还是有一丢丢问题的,比如,我们这个东西好像不能计算小数...不过,我们就可以通过bc来实现小数相关的功能.

通过查看bc的文档,发现bc指令的功能还是非常强大的,但是,此处因为用不到,所以留个记忆就好,以后用到了,再去详细学习.

通过不同的方式执行脚本

当我看书看到这一部分的时候,感觉有些时候爱钻研还是有好处的,犹记得 在学这篇blog时,我就遇到了这一块的问题,当时因为执行脚本的方式不同,造成了执行结果和预期有些出入,所以怀疑自己是不是学了一个假的全局变量.后面问了公司的大牛,然后又百度了一番,才算基本搞明白了这个问题产生的原因.
所以,如果不想让自己在执行脚本的时候,遇到这些奇怪的问题的话,这种执行脚本的方式,还是要好好理解一下的.
这里主要说两类执行shell脚本的方式.
第一种,直接执行,比如,通过./脚本名称这种方式来执行.这种方式需要用户拥有该脚本的x权限.
第二种,通过source 脚本的方式来执行,这种情况下,用户不需要x权限,只要有读的权限就可以.
用一个小故事来讲一下这两种方式的区别.
话说,在一场由贪污灾银引发的官场大动荡事件之后,这个国家的国王,励精图治,整个国家一扫之前的疲敝,一片欣欣向荣,之前受灾最严重的地区,经过四方支援,逐渐建立了一座新城-忘忧.
经过多年的发展,忘忧人民生活逐渐富裕起来,成为了国内首屈一指的富裕城镇,
话说,"当人们的物质生活达到一定程度时,他们就开始希望获得精神上的愉悦"于是,一场充满刺激和财富的娱乐活动在忘忧城中逐渐风靡,这项活动名叫赌石.

在忘忧城里有一个名门大户,是当年平定灾银风波的一位大将军的府邸,号称王府.王府里面有一位三少爷,沉迷于赌石,以致于府内无论老少,多少对赌石有点兴趣.

这一天,阳光明媚,微风温婉,至王府后门悄然溜出一名瘦小的男子,该男子贼眉鼠目,眼睛不时闪过精光,一眼看去,就能感觉到他身上那股奸诈的味道.

该男子,沿着墙脚一路走到城中最大的赌石场,取出二两银子,买了一块卖相很差的原石,拿出自己的解石工具,在一个角落开始解石,不是该男子不想让解石场的人帮助解石,奈何囊中羞涩,实在负担不起一两银子的解石费.

话分两头,在猥琐男溜出王府后,从王府正门走出一行人,打头者,风度翩翩十足的公子哥,正是王府三公子,在三公子的带领下一行人直冲赌石场而去,进入赌石场后,赌石场老板--一名精瘦的中年人,迎了上来,三公子也不多话,自行选了一块原石,令下人排出一百两的白银,就交由赌石场帮助解石了.

但是,赌石风险太大,这三公子买的这块原石在解石的过程中,从头到尾也没一丝涨的意思,不过一块废料而已,就在三公子就要悻然离开时,突然赌石场中爆发出一阵呼声"涨了!大涨!",三公子止住脚步,走到院门处,透过院门正看到另一座院子里一群人围着一个猥琐男子大呼涨了...

额咳咳....好了,故事到这就差不多了...我们是来学习的,不是来看故事的...

我们看一下这个故事哈,故事里面主要有两个主角,一个是猥琐男,一个是三公子.其实这两个主角在赌石场的遭遇,刚好对应着执行shell脚本的这两种类型.

比如,猥琐男子,到了赌石场,花了钱,买了原石,之后赌石场就对他爱理不理了.而三公子却不一样,三公子只是除了钱其余的都是赌石场帮着完成的.

这里这个猥琐男的遭遇其实就是就是我们直接运行shell的方式,首先我们需要拥有脚本的执行权限(解石的工具),之后赌石场分出一块区域让我们使用,至于使用过程中脚本做了些什么,赌石场是不管的.我们直接执行shell也是这样,系统划分一块区域给我们执行脚本,当我们执行完脚本后,系统再回收掉这一块区域.至于过程系统并不会在意.

而三公子则对应着通过source方法执行脚本这种类型,三公子花了钱以后,不需要自己有用解石的技术(脚本的x权限),只需要拥有原石的所有权即可(r权限),剩下的一切交给赌石场来处理.

我们通过source执行脚本的时候,我们只需要拥有脚本的r权限即可,在执行脚本的时候,实际上linux系统会将脚本的内容拿到当前的环境中来执行.

我们拿一个小例子看一下.


啧啧..我感觉我愣是把简单的问题搞复杂了...实在是佩服我自己...懵了看这个...

基础部分没多少东西,本来想把条件判断之类的和他写一块呢,但是想了想不能为了多而把那么多东西放一块,导致很乱,标题都不知道咋取...所以,这是一篇小短文.



这篇关于Linux学习第二十六篇--ShellScript基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270455

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss