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系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

Linux使用粘滞位 (t-bit)共享文件的方法教程

《Linux使用粘滞位(t-bit)共享文件的方法教程》在Linux系统中,共享文件是日常管理和协作中的常见任务,而粘滞位(StickyBit或t-bit)是实现共享目录安全性的重要工具之一,本文将... 目录文件共享的常见场景基础概念linux 文件权限粘滞位 (Sticky Bit)设置共享目录并配置粘

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

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