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

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用