脚本编程之变量

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

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

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

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

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

首先,什么是变量?

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

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

脚本编程之变量

如图,通过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)
old_radishold_radish
上一篇 2017-04-17 20:28
下一篇 2017-04-17 21:46

相关推荐

  • grep命令

    alias命令 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 例一:列出当前系统中所有已经定义的命令别名。 [root@localhost ~]# alias alias cp=’cp -i’ alias egrep=’egrep –color=auto’ alias fgrep=’fgrep –color=auto’ alias …

    Linux干货 2016-01-09
  • grep的使用以及正则表达式

    正则表达式以及grep的使用 grep是一种文本过滤工具(模式:pattern)基本使用用法如下: grep [option] PATTERN FILE grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…] –colour=auto:对匹配到的文本着色 -i:ignorecase 忽略字符大小写 -o:仅显示匹配到…

    Linux干货 2017-08-21
  • LVM逻辑卷管理

    一、lvm介绍     1.lvm概念                        &n…

    Linux干货 2016-09-02
  • 马哥教育网络班22期第4周课程作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@MyCloudServer ~]# cp /etc/skel/ /home/tuser1  [root@MyCloudServer ~]# c…

    Linux干货 2016-09-19
  • iptables

    iptables Firewall:防火墙 隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 分类: 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 软件防火墙:应用软件处理逻辑运行于通用…

    Linux干货 2016-11-07
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-22

评论列表(1条)

  • renjin
    renjin 2017-04-21 10:24

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