shell脚本编程

Shell脚本是包含一些命令或声明,并符合一定格式的文本文件。

程序:指令+数据

程序编程风格

过程式  以指令为中心,数据服务于指令。

对象式  以数据为中心,指令服务于数据。

Shell程序:提供了编写和能力,解释执行。

编程逻辑处理方式:

          顺序执行

          循环执行

          选择执行

Shell编程:过程式,解释执行

编程语言的基本结构

          数据存储:变量,数组

          表达式:  a+b

          语句:    if

创建shell脚本

第一步  使用文本编辑器来创建文本文件,第一行必须包括shell声明序列:#!

          eg: #!/bin/bash

             #!author:

             #!version:

             #!descriptio:

             脚本正文

             :wq (保存)

第二步  运行脚本 

        给予执行权限,在命令行上指定脚本的绝对路径或相对路径。

        直接运行解释器,将脚本最为解释器程序的参数执行。

    

当执行shell脚本时,比如说将脚本存放在/testdir目录中执行时要将该脚本的绝对路径或相对路径写上。

          例如:

            绝对路径     /testdir   test.sh

            相对路径      ./test.sh

如果不写脚本的路径时,系统找的是$PATH变量的路径,当前脚本的路径不在$PATH变量的路径中时,该脚本是不会运行的。

在linux中。系统执行程序时,是不去找当前路径的,即便程序就在当前路径中,也是只搜$PATH变量。

如果希望程序能在当前路径下运行,我们可以用修改$PATH变量的方法来实现。

以修改root的$PATH变量为例,在root的家目录下有一隐藏文件 .bash_profile。用vim打开.bash_profile文件,修改PATH=$PATH:$HOME/bin。在bin后面加“:.”后面的点表示当前路径。

blob.png

在PATH=$PATH:$HOME/bin:.这条命令中,脚本的执行顺序是:先找$PATH再找$HOME/bin,最后找当前路径,所以将“· ”放到最前也是可以的。

当vim设置好保存退出后。$PATH不能及时生效,需要执行 . .bash_profile,$PATH才能生效。

最后在当前路径下执行一个脚本测试是否运行,运行则修改成功,不运行则修改未成功。

但是一般不将当前路径添加进$PATH这样做不安全。

变量

   变量:命名的内存空间

   数据存储的方式:

             字符

             数值:整型    浮点型

      命令执行优先级:别名→内部命令→hash到内存中的外部命令→外部命令

  变量类型:

          作用:

               数据存储格式

               参与的运算

               表示的数据范围

变量命名的法则:

              不能使用程序中的保留字,例如if    for

              可以使用数字、字母及下划线,但是不能以数字开头。

              见名知义。

              同一命名规则。 

          管理员自己定义$PATH变量

          例如:var1=test   这个var1变量的内容就是test,不区分大小写。

               blob.png

变量的名称可以随便起。但是数字例外,组合也是可以的,但是数字不能开头。

定义完成后,如果该变量不想要了也可以删除,执行unset var1。不用再var1前面加”$”,因为unset是专门删除变量的。

用echo $var1验证,不会显示结果。代表unset执行成功,但是系统会生成一个空的$var1。

变量用完后应及时用unset删除,如果不删除,则变量会一直存在于内存中,消耗内存资源。

Set命令可以查看所有变量

变量种类

   本地变量

       直接在当前的脚本或shell中直接写一个变量的赋值,比如说:var1=test,var1这个

   变量是基于本地的,只能在本地终端中用,换个终端就无法执行了。

     

编写第一个脚本   Var.sh

blob.png

当我们将在脚本中定义好的脚本中的变量var1=haha拿到外面echo $var1执行的时候,是没有结果的,说明var1这个变量只能在脚本内起作用。执行var.sh这个脚本的时候,执行结果也是为空。

将var.sh脚本稍作修改

blob.png

当再去执行var.sh脚本的时候,显示了$var1的变量结果:haha,所以该变量只能自己用。

blob.png

编写第二个脚本  var2.sh

    blob.png

执行var2.sh脚本。显示了$var2的变量结果:xixi

blob.png

这两个脚本各自显示各自的变量值,互不影响。

将var.sh这个变量稍作修改,让其调用var2.sh

    

  blob.png

执行var.sh脚本  分别显示了var.sh的值,也显示了var2.sh的值

blob.png

将var2.sh脚本稍作修改

blob.png

执行var2.sh

blob.png

上图显示第二行var2.sh中显示的是空。当var2.sh尝试去调用$var1的变量结果的时候,没有成功,因为$var1变量是在var.sh中定义的,var2,sh本身没有,所以调用失败。

可以讲var.sh与var2.sh做个对比

blob.png

blob.png

从上图的对比中可以看出,var.sh不仅显示了自己的执行结果,还调用了var2.sh的执行结果。但是var2.sh显示了自己的执行结果,但是当它尝试去调用$var1变量的的结果的时候却失败了,因为$var1的变量是定义在var.sh脚本中的,其本身并没有,所以无法直接调用。

Var.sh调用var1.sh,其调用的关系就是父子进程的关系。

本地变量的有效范围是不能直接在当前shell中有效,甚至是子进程都不能使用。

环境变量

    环境变量具有继承性,在变量前夹export就可以将$v1变量继承下去。

新建脚本var1.sh

blob.png

    var1.sh脚本不仅显示自己的结果,还去调用var2.sh的结果。

新建脚本var2.sh

blob.png

    var2.sh脚本不仅显示自己的结果,还去调用$v2变量和var3.sh脚本的结果    

新建脚本var3.sh

blob.png

var3.sh脚本调用$v1变量的结果。

当执行var1.sh的时候,var2.sh  var3.sh都可以调用$v1变量的结果。

blob.png

只读变量

也称为常量,比如定义圆周率,P=3.14159。有可能会被修改。如果不想被修改,则用readonly将P定义为只读变量,便无法修改。

只读变量甚至删业无法执行,除非程序退出,再进入,则只读变量自动消失。

blob.png

位置变量

新建脚本test.sh

 blob.png   

执行test.sh脚本

blob.png

上图中,$1相当于 aa ,$2相当于bb,$3想当于cc,$*相当于aa  bb  cc  dd。

在脚本代码中,调用通过命令行传递给脚本的参数。

$1 、$2……….对应第一、第二个参数。Shift[n]表示换位置

             $0    代表命令本身

             $*    传递给脚本的所有参数,全部合为一个字符串

             $@   传递给脚本的所有参数,每个参数都为独立的字符串

             $#    传递给脚本的参数的个数

逻辑运算

True      false

     1         0

            与:                               或:   

           1 与 1 = 1                          1 或 1 = 1 

           1 与 0 = 0                          1 或 0 = 1

           0 与 1 = 0                          0 或 1 = 1

           0 与 0 = 0                          0 或 0 = 0

逻辑运算

 非:!

! 1 = 0

! 0 = 1

 短路运算:

短路与:

第一个为0,结果必定为0;

第一个为1,第二个必须要参与运算;

短路或:

第一个为1,结果必定为1;

第一个为0,第二个必须要参与运算;

 

异或: ^

异或的两个值,相同为假,不同为真。

Exp1=exp2      假

Exp1!=exp2    真

原创文章,作者:zzd,如若转载,请注明出处:http://www.178linux.com/35756

(0)
zzdzzd
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相关推荐

  • 网络管理总结

      在学习Linux的快两个月时间的这个阶段,我们学习到了网络的相关知识,哇,原来我们上网是需要这么多步骤的,玩了这么久的电脑,打开过无数网站还只是停留在以为打开网站只需要点点鼠标的层面,惭愧惭愧。学习了一周,终于了解了一些网络的基层结构和一些网络协议,下面是对这一周所学知识的一些总结,加强记忆和理解。还停留在以为打开一个网站只是动动鼠标…

    2017-09-02
  • 马哥教育网络班21期-第七周课程练习

    第七周作业 1、创建一个10G分区,并格式为ext4文件系统; [root@qq ~]# fdisk /dev/sdb         #使用fdisk命令进行分区; Device contains neither&nb…

    Linux干货 2016-08-08
  • C语言的整型溢出问题

    整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件。在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码。 什么是整型溢出 C语言…

    Linux干货 2016-06-03
  • HTTP详解(3)-http1.0 和http1.1 区别

    翻了下HTTP1.1的协议标准RFC2616,下面是看到的一些它跟HTTP1.0的差别。 1. Persistent Connection持久连接        在HTTP1.0中,每对Request/Response都使用一个新的连接。      …

    Linux干货 2015-04-04
  • Linux磁盘管理高级

    Linux磁盘管理高级 LVM Btrsh LVM 逻辑卷管理(LVM)指系统将物理卷管理抽象成一个逻辑卷,包括重新设定文件系统的大小,LVM可以弹性的更改LVM的容量,通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量。 LVM还有快照的功能,快照区与原本的LV共用很多PE的区块,因…

    Linux干货 2016-09-09
  • 磁盘管理2——文件系统挂载和swap文件系统以及磁盘管理工具

    文件系统的使用: 首先要“挂载”:mount命令和umount命令 根文件系统之外的其他文件系统要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此管理操作即为“挂载”,此目录为“挂载点” 挂载点:MOUNT_POINT,用于作为另一个文件系统的访问入口     (1)事先存在   …

    Linux干货 2016-08-29

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-15 10:21

    总结的很详细,并且通过具体操作加深了自己对变量的理解,