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 rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet