脚本编程之变量

简单跟大家介绍一下脚本编程中的变量。

大家都知道,脚本编程,主要由三个部分组成,一是命令,二是变量,三是控制语句。

变量的使用,可以让脚本变得更加简洁,高效。

我们主要简单讲一下变量的概念,变量的类型,变量的种类,不同种类的变量是如何定义的,变量的基本操作,以及变量的配置文件。

了解了这些,我们还可以聊一聊变量的高级操作。

首先,什么是变量?

通俗一点讲:变量就是一段命名的内存空间。

我们给内存的一段空间,取一个名字,赋一个值,这个过程就是定义变量的过程。

脚本编程之变量

如图,通过echo变量的名称,就可以将变量的值显示出来。

定义一个普通的变量非常简单。

了解了变量的基本概念,我们可以说一说变量的种类。

变量主要有以下几种:

1:环境变量

2:本地变量

3:局部变量

4:脚本参数变量

5:特殊变量

环境变量:对整个系统环境生效,像对当前shell,或是再在当前shell执行bash命令,进入一个子shell。环境变量都是生效的。

如图。

脚本编程之变量

环境变量要通过export这个命令来定义。当然,还有其他命令,像declare -x 也能定义一个环境变量。

最常见的环境变量有PATH ,PWD ,BASH,RANDOM,想必大家都很熟悉了。

本地变量:仅对当前用户的当前shell有效。

脚本编程之变量

如图,我们可以看到当我们开了一下子shell,进入子shell的环境时,父shell定义的变量已经无效了 。

局部变量:仅对某个代码片断有效。定义方式:local name=value

脚本参数变量:跟在脚本后边的参数,脚本会自动保存在自己内建的变量中,以$1,$2,$3这样的顺序命名。如图

脚本编程之变量

space2.sh是一个简单的算空白行的脚本,当在它的后边给出参数/etc/profile时,就会自动将这个参数保存到脚本内建的变量$1中,并在脚本中进行引用。

特殊变量:这是sehll内部定义的变量,常见的有$$ $?  $#  $* $0

如图

脚本编程之变量

第一个$$是查看当前shell的进程号的,第二个$?是一个非常常用的特殊变量,它的值是上一个命令的执行状态结果,根据这个结果我们可以判断上一条命令是否执行成功。常常用在脚本中,而$#则是表示脚本运行时的后边跟的参数个数。$*表示脚本运行时后边跟的参数的队列,特殊变量$0则表示脚本或程序本身的路径。

变量的定义:

环境变量定义方法:declare -x name=value ;  export name=value

本地变量定义方式:name=value

局部变量定义方式:local name=value

脚本参数变量:脚本自动定义

特殊变量:shell 内建

其实还有一些其他的定义方式:如定义变量只可读readonly name=value declare -r name=value ;定义数值变量可以用declare -i 定义。

脚本编程之变量

如图,定义只读变量,当我们想要修改时,会被拒绝,这就是只读变量的特殊之处。

脚本编程之变量

定义数值变量,即明确说明这个变量是按数值的形式存储,数值是可以直接进行加减运算的。若是不明确定义是数值变量的话,如图num2中,它就是按照字符的形式存储,当然算不出结果啦。

变量定义好了,我们可以了解一些常用的操作。

最常用也是最简单的方式就是对已经赋值的变量,直接引用了,即$name。其他的还有命令引用,语法格式有两种,一种是name=${command}.另一种是name=`command`。这两种方式都会直接引用命令的执行引果作为变量的值。

如图:

脚本编程之变量

变量time的值并不是我们手动给予的,而是通过命令传递的,它的值是反引号中date +%F的执行结果。

有时我们需要对变量进行查看,就需要用到一些命令。

最常用的就是echo了。格式为: echo ${name}

其次,我们还可以通过env ,envprint ,declare -x ,export ,set 对变量进行查看。

有定义,就有撤销,撤销变量很简单,直接unset name即可。

还有一个我们常用的变量的操作就是对变量进行算术运算。变量想要实现算术运算,就要按照一定的表达式书写,常用的表达式如下:

let var=#+#   let var++

var=$[#+#]  var=[var+#]

var=$((#+#))  var=((var+#))

当前,上面举的运算符都是+。其实其他的运算符书写也是一样的。不过,需要注意的是,*运算符在某些特定的场合需要转义。上表中,其实后边的let var++这类运算也称为变量的自增运算。只要表达式写正确,结果都没问题。

其实变量的算术运算,用得并不多,即使用,也是简单的加减运算,如在脚本的while循环中,每循环一次做一次自增运算以不断修正满足条件等,简单至极,故不作详细说明。

既然变量是命名的内存空间,值是存储在内存中的,那么一关机,变量的值肯定就不会存在了。有什么办法可以解决这个问题?

聪明的你当然能猜到,肯定是将变量写到配置文件中。在系统启动时,读入配置文件,那么之前定义的变量,就又生效啦。

那我们来了解一下这些配置文件都有哪些,他们都是做什么用的。

第一个是/etc/profile文件。这个文件在linux中是非常重要的,如果不够了解它的作用,建议不要随便对它进行修改,以免发生不必要的麻烦。大多数时候,我们唯一对它的修改,就是在里面添加一个程序的PATH环境变量。

profile是一个系统级别的配置文件,它为每一个用户设置环境信息,是每一个用户登陆时,首先载入的文件,并且也只载入一次。它定义了掩码(umask),执行的调用命令,定义PATH环境变量,登陆时给的提示信息,显示系统版本,命令提示符,等。

第二个是/etc/profile.d目录下的所有文件。它主要定义了系统中应用程序的环境变量。

第三个是~/.bash_profile 前两个/etc/profile ,/etc/profile.d目录,定义的环境变量对所有用户都生效。若是用户想定义仅对自己生效的环境变量,可以写入此配置文件中。这个文件其实就相当于环境变量的个人版。并且,也只在开机的时候执行一次。

第四个是/etc/bashrc 主要用于定义命令与别名,本地变量,也是对所有用户生效,并且在每次执行一个脚本时,这个文件都会被读取一次。

第五个就是~/.bashrc,这个是/etc/bashrc的个人版,功能差不多,只是生效的范围是仅对当前用户生效而已。

了解这些配置文件,分别定义了什么,我们大体可以对它们进行分类。

全局配置:

/etc/profile

/etc/profile.d

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc  rc 其实就是run command的缩写)

了解变量的分类,知道它们是做什么用的。其实我们也很有必要对他们的读取顺序进行了解。这样有利于我们对Linux系统的进一下理解。

要了解读取顺序,我们有必要先了解一些登陆时的一些概念。

聪明的你应该注意到,对linux系统的操作,是为分交互式与非交换式的。简单归类一下,

交互式,就是通过su – 这种方式切换过去,或是我们通过输入账号密码登陆进来的。非交互式,主要有脚本运行时打开的另一个子shell ,我们图形界面中打开的另一个终端。

交互式,与非交互式他们对变量的配置文件的读取顺序是不同的。

正因如此,交互式与非交互式,它们的环境变量是不一样的。

交互式读取的顺序:/etc/profile –> /etc/profild.d –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

非交互式读取顺序:~/.bashrc –> /etc/bashrc –> /etc/profild.d

 

了解了上边这些,我们对变量可以说有一人比较全面的认识了。有兴趣的朋友,我们还可以一起探讨一下变量的一些常用的高级操作。

如变量的切片,变量字符串的长度计算,字符的删除,字符的替换,以及变量若为空时的默认赋值。

首先说一说变量的切片,咱们直接看实例吧。

脚本编程之变量

大家可以猜出,变量的切片是从0开始数起的,到结束的那位却并不包括结束的那个字符。变量的切片有什么用呢,肯定就是当变量很长的时候,自己想要哪部分就切哪部分啦。

接下来说说变量字符长度的计算。非常简单,看图。

脚本编程之变量

个人目前没发现长度计算有什么大用,都是直接用数的。

字符的删除,有两种,从前面删,从后面删。

先说从前面删,它是根据匹配的pattern来删除的。操作符是#。一个#表示删除一个匹配到的pattern##表示全部匹配到的。

脚本编程之变量

说完从前面删除,再说说从后面如何删除。如图。

脚本编程之变量

需要注意的是,从前面删除与从后面删除,他们匹配的pattern是不一样的。

从前面删除时,是*. 而从后面删除时,pattern也要从后面匹配。

变量的值中字符的替换:这和sed编辑器中的替换非常接近。看图:

脚本编程之变量

只要找到其中相符的pattern,后边再加上要换成的patter,就可以完成替换。当然,得出来的结果我们可以赋值给一个变量。例如写成这样linux2=${linux/centos7/redhat}

看完上边,接着我们再聊一聊变量高级操作中,我们最常用到的。

试想当我们在脚本中,得到一个变量时,我们常常想若这变量有值,则直接引用,若是没有值,我们能不能给这个变量一个默认的值呢?这样一来我们就可以省去一些写条件判断的麻烦。若虽没给变量值为空,我们直接给变量定义一个默认值,然后放到脚本中运行并进行输出相应结果。

如何给呢?其实也非常简单。

脚本编程之变量

这种写法,表示若是变量有值,则会显示出变量原来的值并且不对变量进行重新赋值,若是变量没值,即为空时,则给一个我们自己定义的默认值,并将其显示出来。

这即是全文,从变量的基础概念,到变量的类型,种类,不同种类的变量如何赋值,变量定义好了,我们可以对变量进行哪些操作,以及变量的配置文件的划分,如何将合适的变量放到合适的配置文件上产生我们期待的结果。最后又简单聊了聊变量的常用高级操作。

希望对大家有帮助。

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

(0)
上一篇 2017-04-17 20:28
下一篇 2017-04-17 21:46

相关推荐

  • vim编辑器

    vim编辑器 vi:Vistual Interface,是一种文本编辑器,所谓文本编辑器就是基于字符编码的文件,常见的编码有ASCLL编码,UNICODE编码。 vim:即vi IMproved:vi的增强版,可以使用颜色或者底线等方式来显示一些特殊信息,是模式化的编辑。 文本编辑器的种类 行编辑器:所谓行编辑器就是一行一行来编辑处理的工具,如sed 全屏编…

    Linux干货 2016-08-15
  • NTP时间服务器

        在集群环境和需要日志同步的多服务器应用中,为了能够保证多台服务器的之间的正常协作,就必须使它们的时间保持一致,在多台服务器上手动调整时间是极其不科学的,这时就需要借助于NTP时间服务器来完成时间的同步。     一、NTP服务器的安装    …

    Linux干货 2015-06-25
  • 网卡路由配置信息及偷懒用法

            对于初学Linux的人来说,配置网卡无疑是比较晕的,各种的配置文件,字段、命令等让人眼花撩乱。所以这一章主要给大多数还在网卡配置路由配置的同学们解惑一、网卡配置基本概念        …

    Linux干货 2017-05-08
  • 计划任务

    任务计划Linux任务计划、周期性任务执行未来的某时间点执行一次任务:atbatch:系统自行选择空闲时间去执行此处指定的任务周期性运行某任务:cron     at任务at命令:at [option] TIME常用选项:-V 显示版本信息:-l: 列出指定队列中等待运行的作业;相当于atq-d: 删除指定的作业;相当于atrm-c: 查…

    Linux干货 2017-08-28
  • 堡垒机-麒麟堡垒机动态口令使用手册

      一.管理员部分 1.在其它-licenses菜单查看动态口令许可是否打开,如果未打开联系厂商重新生成许可   2.找厂商生成密钥文件,密钥文件中包含令牌种子,在其它–动态令牌菜单将密钥文件导入即可看到所有的令牌种子,每个令牌可以绑定给多个用户     3.令牌绑定可以在 资源管理–…

    安全运维 2016-05-29
  • 学习开始拼搏、加油、努力

          搏一搏单车变摩托,用4个月时间为自己创造一个更好的未来,欧耶!。。。

    Linux干货 2016-10-28

评论列表(1条)

  • renjin
    renjin 2017-04-21 10:24

    主要介绍了shell编程中的变量定义,内容写的很不错,排版上图片没能显示。在写完博客之后,尽可能的注意一下,或者检查一下