shell脚本理解到编写个人思路(适合初学者)

Shell脚本个人思路

(前提要掌握linux常用运维命令以及各类服务的内容前提下读)

 

因本人经验有限,还请各位大佬多多指教老弟也可以做出修改,发自内心的感谢,

学习期的小白也可以看看我分析的思路,或许可以起到一些帮助!

 

还是老规矩带着问题去探索

  1. 什么是shell脚本
  2. 有什么作用
  3. 为什么要用shell脚本
  4. Shell脚本的缺点
  5. Shell脚本的用法
  6. 如何去写shell脚本                 

 

  还是先从我自己的理解角度去解答这几个问题,然后再做分析。

  1. 什么是shell脚本

  在我看来shell不过是将我们平时用的命令写到一个文件中,配合上一些shell脚本的语法(条件判断,循环语句),然后让系统去执行这个文件相对于的也会自动去执行我们在文件中所写的命令。

2.有什么作用。| 3.为什么要用shell脚本(这两个问题我们放到一起去解释)

  我们首先考虑一个问题,比如说我们当前有几百台电脑需要去安装一个软件,那么如果我们从下载到安装(包括同意用户协议,下一步下一步的点),那么这个时候如过我们一台一台去下载安装,我们假设1台电脑的操作时间为10分钟那么一台一台去操作100台就需要1000分钟,我们算一下这笔账,1000分钟相当于17个小时。这样下来成本的消耗就会很大。

  可能有些人会想,我只是时间用的多有什么成本的损失呢,但是我们这样去想,我们拿着万八千的工资,一天工资七八百,8小时上班时间你的17个小时用来安装软件,公司要给你发2天的工资。咋们换位思考一下,如果你是老板,你请了一个人花一千多块钱去给你安装一个软件,你也不愿意。当然可能也会有人说,我安装软件我可以同时几台电脑安装,但是有没有想过你要交互式的去操作呀,你同一时间能同时操控多台电脑吗。

  那么好,这个时候脚本出现了,我首先可以将安装的步骤命令写到一个文件中,然后把这个文件执行到这100台机器中,软件的下载安装所有步骤不需要你去交互,因为你已经把交互的过程写到这个脚本中了,那么这个时候不就很明显了吗。

  脚本的作用也就是能够让你更加省时间的去做一些事。节省很多麻烦以及很多成本方面的消耗。当然后续也会配合一些自动化运维工具(比如ansible,在这里不过多的去解释)去同时批量执行这个脚本,也不需要你写好以后一个一个上传然后再执行,

3.shell脚本的缺点。

  在我刚开始写shell脚本的时候发现一个问题,比如我正常执行把一个文件复制到另一个目录中时,如果这个目录中已经有一个同名文件的时候,系统会提示你是否覆盖,按y或者是n确认或者取消,如下图所示

  

 

  那么我当时是不知道如何解决的,我甚至想过写一条echo y”,但后边考虑这样的话在脚本中相当于是下一条命令了,所以不现实。

  那么我的解决方案是,先写删除这个文件的命令,再去写复制的命令这样就不会出现这个交互了。

  所以我总结的是shell脚本再面对一些突入其来的交互内容时会很难搞。而这个也可能时他的缺点吧。

 

  4.Shell脚本的用法

 

  Shell脚本的使用有很多种:

  比如直接用bash|sh命令加路径去使用

  或者是授给其执行权限后使用。

这里就不做过多的解释了,(概念性的内容咋们还是老老实实背一下)

  那么我在这分析一下什么时候用bashsh命令执行,什么时候需要加权后运行

1.如果执行这个shell脚本的角色是我们自己其实可以用bashsh命令执行

什么是主动执行呢? 首先我们可能此时就在系统内盯着,正在系统中做一些事,完事以后我们此刻需要执行一下脚本,我们就可以手动输入bash 脚本路径去执行。而执行的时候实质上我们也用到了权限(因为我们当前所登录的用户有执行权限)

2.如果执行这个shell脚本的角色是系统时,就需要去加权执行。

  首先,这个情况大多会在周期计划任务中写一些命令,让他定时执行脚本内容。但是这个操作时由系统发起,而这个时候系统就会判断这个文件是否可以执行,而系统判断的时候其实就是直接看这个文件有没有root用户给他附加的执行权限。

综上所述,我认为如果执行脚本的角色是运维人员,他们已经有执行系统文件的权限了所以就可以直接拿bash命令去执行,而如果执行脚本的角色是系统,他就需要判断这个文件是否有执行权限再去做出所对应的操作(执行或不执行)

 5.如何去写shell脚本

  好了重头戏来了,了解shell脚本的一些内容后来到了编写shell脚本的地方了,提个醒,下文保守1w字 哈哈哈~~~~~~~~

  首先我们要知道写shell脚本的你需要具备什么条件。

  1. Linux基础命令与服务安装执行步骤(因为这是shell脚本的本质工作内容)
  2. Shell脚本的变量配置。
  3. Shell脚本的格式,后缀。
  4. Shell脚本的一些条件语句(判断 循环)
  5. Shell脚本函数

  在这里我们从第二条开始出发去做一些了解分析

①变量

  变量是什么,通过字面意思可能有些人会觉得是一个持续变化的量,起初我也是这样认为的,但是接触以后发现shell脚本中这个变量其实是赋值的意思比如a=1在这里我们给a赋值了一个数字 让a=1了,很简单的例子其实这也就是shell脚本中的变量了,总结一下就是赋值。给某个字符附上一个值,但这里变量也分很多种,我们一种一种去分析。

   首先怎么去设置变量 变量名=变量值这就是设置变量的方法如下图:

 

 

 

  我们可以看到 我们用这个格式 a赋值1

  随后echo $a 输出这个变量的值系统输出的就是咋们刚才所设置的这个a变量的值1了。

  变量名的定义也需要注意 变量名必须是字母或者下划线开头,不允许出现特殊字符,而且区分大小写,我们也可以使用echo 查看你所定义的变量值,$后面是一个变量的名字。

  而大家也要注意的是,我们所定义的变量也是有生效范围的,打个比分,我们的父母平时在家叫我们的小名,而这个小名相当于是给你自己赋的一个值,而除了父母或者说是关系很好的朋友知道以为,别人不知道的,如果跳出这个环境时说你的小名没人知道是你。之所以你家里这个环境的人知道,是因为这个小名时他们给你定义的。我觉得这样说应该可以清楚这个事。

  所以我们所定义的变量也是这个道理,他只会在当前环境下生效。那么什么是当前环境呢?比如我们现在用xshell远程连接软件去连接你的服务器会有一个执行命令窗口,而你同时可以在xshell里开好几个窗口去连接你的服务器,而这不同的几个窗口就是不同的环境。我们也称为终端,每一个终端都会是一个不同的环境。如下图所示

 

 

 

 

 

 

 

 

  那么我们在分情况在说说变量类型吧!

A:位置变量

  位置变量也可以说成是位置参数,作用是为脚本传递参数,用$1,$2.....${10}...表示

  当我们设置后在执行脚本时需要在命令后加上你要传递的参数。

  打个比方。我们现在设有2个盒子,而我们知道这2个盒子一个让别人装书本,一个装玩具,这里我们可以把这个盒子当作一个位置变量。那么我们在使用这个盒子的时候得往里面放东西吧,我们放的东西相当于是给他传递的值。

  也可以说位置变量就是你提前设置的一个存放点,后续只需要拿东西来存进去然后在调用!

B:预定义变量

  预定义变量可以理解为系统定义的变量,不能修改,不能赋值。

  比如$@ $* $0 $# $?

  $@ $*表示所有位置参数的内容

  $0 表示当前执行的脚本或程序的名称

  $# 表示命令行中位置参数的个数

  $? 表示前一条命令执行后的结果,如果是1则为执行错误 0则为正确执行

  这些预定义变量的意思我们不去过多解释还是那句话 概念性的东西安心背就可以,网上一查也会有很多的内容。

  在这里我挑2个说一下

   $@ $* 2个预定义变量的意思都是表示所有位置参数的内容。

但是他们有个区别是$* 显示出来的参数是一个整体(不管你有几个变量,我都会给你显示,但是会以整体的形式给你显示出来) 而$@他的结果是个体的(所有的变量都会显示出来,但是如果你有2个变量 那么他显示出来是以2个独立的个体显示的。虽然看上去内容都一样)

②脚本格式,后缀:

1#!/bin/bash 表示脚本通过以/bin/bash 程序来编写

2# 表示注释信息,例如:对编写的脚本作用进行解释,每写一段脚本之前都应该用“#来注释以下命令执行的结果

3、定义脚本中的变量

4、定义脚本中的函数

5、脚本执行语句 (if 判断、while/for 循环、case 选择等语句)

6、利用 echo 定义输出一些让人更容易看懂得信息 (可以是中文也可以是英文)

 

  下图就是一个脚本 目的是进入boot下 输出一句目前目录位于 然后在执行pwd命令

 

 

后缀:

   .sh 表示编写程序为 shell

   .go 表示编写程序为 golang

   .py 表示编写程序为 python

注意:脚本不仅仅只有shell可以写 其他的语言也可以写 在这里我们不需要去知道别的语言是如何去写的我们只管知道shell脚本的后缀是.sh就可以。这里不需要去纠结,每类文件都有每类文件特有的后缀,比如文本为.txt 影视为.mp4 网页为.html.php

所以我们的shell脚本也有其自己的后缀 .sh

Shell脚本的一些条件语句(判断 循环)

 从这里开始难点就来了,要写这些语句首先得知道一些条件判断规则,这个百度都可以查到不解释,直接进入语句模块,下方列举出来一些判断的语法

判断数字时的关系

-eq 等于 -ne 不等于 -gt 大于 -lt小于 -le 小于等于 -ge 大于等于

可以3个等于大于小于 其他的很简单就是这几个的开头字母结合起来

判断字符串时的关系

= 等于 != 不等于

判断文件类型

[ -d 路径 ] 判断这个路径是否是目录

[ -f 路径 ] 判断这个路径是否是文件

[ -e 路径 ] 判断这个路径是否存在

逻辑符号

字符串 $$/-o 字符串 : 前后必须都成立才可以成立

字符串 ||/-e 字符串 : 前后只要有1个条件成立了就可以成立

!字符串:成立的给他变成不成立,不成立的变成成立。取反的意思

注意:我们判断后可以用echo $? 来看结果 如果为0则成立也可以说是真 ,如果不是则不成立也可说是假,如图所示:

 

 

那么如果存在自然也会输出0

 

了解了判断规则接下来了解一下每一个判断语句然后上实例去分析理解!

 

If条件语句

If条件语句分为3种单分支,双分支,多分支。

我只写结构 以及作用 后边做一次分析

单分支

      

 

双分支:

 

 

 

多分支:

  

 

那么既然我们知道了if语句的3个不同分支我们可以根据右边蓝色提示去理解讲一下我第一次接触的时候是如何写脚本的吧,我们拿一个案例来讲一下

  1. 写一个shell脚本,判断一下root下有没有123这个文件, 如果有就输出已经有这个文件或目录了,如果没有就创建一个,否则就输出你的判断有误!

   那么当我看到这个题目的时候我会去通过这个题目去抓取一些关键信息。比如:

shell脚本:我能得到的信息是我得用shell脚本去写(用.sh后缀文件)

判断一下:我能得到的是要用if判断语句

如果有就输出如果没有就创建 :我能得到的信息是我需要判断2次(这里需要说明一下,虽然判断可以用逻辑符 $$ || 去一次判断2个不同的条件但这里其实是判断相同的条件只是结果不同所面对的执行内容也不同) 那么通过这个信息我可以知道超过了2次判断,要用多分支结构。

创建文件:我可以得到的信息是条件判断then后的命令是创建文件。

否则输出***:我可以得到的是需要用else来表示如果上方的判断都不成立那我就输出****

综上所述再加上对题目的理解,这道题的最终目的是让你创建一个123文件,而判断只是为了确保这个文件原本的状态是有还是没有

至此对于题目的分析结束 ,而这里其实我也是用到了分层分级的一个想法,也就是把题目分层来寻找对我有用的关键信息。那么到这里我结合一下上方信息就很明确我写的内容,用的语句,用哪个分支输出什么了。

那么对于新手来说我的建议还是在学习的过程中分析以后先把结构给他写下在再把判断的内容用题目原话写进去如下所示

 

那么到了这里这个脚本就很简单了,只需要利用我们学到的命令或者是一些判断的语句去将上方的中文翻译过成命令或语句这个脚本也就完成了。如下所示

 

那么好至此这个题也就做完了,在这里给我只举一个多分支例子,题目是什么不重要,关键是要去看我这个思路,可能不是最好的,但对我自己的帮助是很大的。

总结一下 看到题目的时候 先分析题目 把题目拆分成几个层次,再从这几个层次中找到关键信息,然后写下你要用的框架,在把题目要求直接复制到这个框架里 最后在翻译成我们所学过的命令或者判断语句。这个方法对于刚接触脚本的同志们还是很好用的,用着用着你就会发现,当你看到一个题目的时候思路会非常清晰,也就变得很简单了!!

 

for 循环语句

继续上结构然后分析上案例吧。

 

 

案例:

  1. 写一个shell脚本,让其自动创建user1-10 10个用户。

老规矩分析题目的目的以及抓取关键信息

 

创建user1-10 10个用户:虽然这里题目很短,我们所能够抓取到的关键信息很少,但是只要有一条,我们也可以将这条内容拉出来以后放大化。根据上方for循环作用分析,他是从取值列表里一直取值并且执行一个命令,那么我们可以把1-10当作取值列表,把创建用户当作要执行的命令。那么这样想其实并不难,我们还是试着将题目内容复制在for循环结构中,

 

 

 

标注都已经做了,理解方面应该没什么问题吧。

 

然后再将上图内容翻译成命令或者语句

 

 

 

至此全过程也就结束了,分析以及实现过程于if结构其实是没有差距的,都是分析题目然后把题目内容复制到结构中,然后翻译成命令语句。

 

 

While 语句语法

 

 

 

案例:用shell脚本的while语句创建user1-user20用户。

       老规矩还是首先分析题目能给我们带来那些信息。

      while语句创建user1-user20用户 :初学者看到可能能够利用到这条消息只有while语句,那么具体如何去实现呢。While语法的用法确实是有一点抽象,我直接上答案做分析吧。

 

 

  

总结一下:while语句做循环判断,判断的其实是你自己在执行这条判断语句之前定义好的值,然后再命令中让这个值发生有规则的变化然后继续进入判断语句让其判断执行,直到条件不满足为止!!!

 

case 语句

 

 

案例:用case写一个提示用户输入一个值,判断这个值是数字还是字母,还是特殊符号的脚本!!!!

  首先分析题目:

   用户输入值表示需要用到交互命令read

   case语句:明所用的结构。

   判断这个值是数字还是字母,还是特殊符号:明确判断的内容是什么?

确认这些内容以后,老规矩把题目内容复制到脚本中!!!

   

 

然后再将这些内容翻译成计算机命令

 

 

  个人建议初学者刚开始可以一直用这个思路去写,用着用着思路也就出来了,而关于命令结构方面的内容确实也是需要去背。但同样的道理,当你用的多了自然而然也就记住了!

   

   以上就是shell脚本中的一些判断循环语句,当我们掌握这些语句以后,就可以做一些高阶的内容了,比如循环语句套循环语句。再下方我写2个例子并且做分析。当然网上很多脚本都可以多看看,可以不看内容但是要慢慢接受其他脚本的思路,也就是第一步做什么,第二步做什么。

   

 

 

 

 

 

 

 

所有的语句都不是单独使用,我们要做的是理解每一个语句以后,把几个语句结合起来使用,

比如上方if判断里面套if判断   for循环里面套if判断 ,这个具体要看你自身的需求!

 

posted on 2023-06-01 19:11  萧痕痕痕痕  阅读(208)  评论(0)    收藏  举报

导航