简单跟大家介绍一下脚本编程中的变量。
大家都知道,脚本编程,主要由三个部分组成,一是命令,二是变量,三是控制语句。
变量的使用,可以让脚本变得更加简洁,高效。
我们主要简单讲一下变量的概念,变量的类型,变量的种类,不同种类的变量是如何定义的,变量的基本操作,以及变量的配置文件。
了解了这些,我们还可以聊一聊变量的高级操作。
首先,什么是变量?
通俗一点讲:变量就是一段命名的内存空间。
我们给内存的一段空间,取一个名字,赋一个值,这个过程就是定义变量的过程。
如图,通过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
评论列表(1条)
主要介绍了shell编程中的变量定义,内容写的很不错,排版上图片没能显示。在写完博客之后,尽可能的注意一下,或者检查一下