变量不管是在哪种开发语言中,都占有着举足轻重的位置,可以使我们的脚本更加灵活,也能提高其迁移性。对于变量的设置规范有了通透的了解之后,既能避免不必要的错误,也能保证脚本撰写的效率。因为往往一些莫名其妙的报错,都是由于不规范的变量设置引起的,左查右查,最终查出是由于书写不规范引起的,往往会气的发笑。 说了那么多,我就归结一些关于变量的知识
一、变量的设置 (1)变量的一般赋值 变量的一般赋值较为简单,就是运用“=”来进行,但是应注意的是,等号两侧不应添加空格
[root@localhost ~]# bianliang=123 [root@localhost ~]# echo $bianliang 123 [root@localhost ~]# echo ${bianliang} 123由上,变量的输出应该在变量名前加“$”,具体的写法也分两种,在这里推荐使用第二种写法,因为其在后期变量输出值修改时有规范变量名的效果
[root@localhost ~]# echo 1$bianliang1 1123 [root@localhost ~]# echo 1${bianliang} 1123 [root@localhost ~]# echo $bianliang1 [root@localhost ~]# echo ${bianliang}1 1231可以看到,在变量前加入输出是,并不会有影响,但当在变量之后加输出值是,可能会导致变量名的混淆,识别为未声明变量,导致输出异常 (2)变量的运算 变量运算式的写法如下
[root@localhost ~]# a=1 [root@localhost ~]# b=2 [root@localhost ~]# let a+b [root@localhost ~]# let c=a+b [root@localhost ~]# echo $c 3 [root@localhost ~]# echo $[a+b] 3这里看到,两种的写法都能正确的给出结果,但同样的,个人更倾向于写法二,更简单清晰,这也因人而异。但是要注意的是,不能直接对刚赋值的变量进行算术运算,应为变量默认的设置类型为字符型,而并非整数型,那么直接计算的结果必然是错误的,当然,我们可以使用特殊的命令来转换其类型,那就是declare/typeset,这两个命令是等价的
[root@localhost ~]# a=1;b=2;c=a+b; [root@localhost ~]# echo $c a+b [root@localhost ~]# typeset -i a;typeset -i b;typeset -i c; [root@localhost ~]# a=1;b=2;c=a+b; [root@localhost ~]# echo $c 3我们运用typeset命令“-i”的选项把变量类型转变为整数型,就可以正确的进行运算了,当然还有其他的一些选项。
-i :定义成为整数数字类型-x :定义为环境变量;-r :将变量设置成为只读类型-a :将变量定义成为阵列类型这里也是简单的说一下不能直接运算的原因,关于更深入的变量类型暂时先不展开讨论。我们平时运用$[ ]就可以解决这类问题,不必去麻烦转化类型。 (3)变量的命令式 变量的命令式赋值可以将命令的运行结果直接复制给变量
[root@localhost ~]# a=$`hostname` [root@localhost ~]# echo $a $localhost.localdomain [root@localhost ~]# b=$(hostname) [root@localhost ~]# echo $b localhost.localdomain可以看到两种方法得到变量的结果都是一样的。
二、变量的修改 变量值的修改我们通过简答的赋值覆盖来完成,但是我们这里要说明的不是此种方法,而是具有判断效益的赋值修改,也就是根据变量的当前值判断是否进行复制修改,大致分为四种操作“-”“+”“=”“?” (1)“-”/“:-”
[root@localhost ~]# a2="";a3=" ";a4=1; [root@localhost ~]# a1=${a1-5};a2=${a2-5};a3=${a3-5};a4=${a4-5}; [root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4} 5:: :1由上的实验,我们先解释一下,a1、a2、a3、a4分别代表了变量的四种不同状态,即未定义、空值、含空白符、有当前值四种状态,用“-”分别对四种状态进行赋值覆盖实验,并观察结果。得出的结论为“-”操作只对为设定的变量进行值覆盖,包括空值在内的状态都不予影响,可谓是十分绅士^_^。“-”还有一种拓展用法,便是“:-”,那么我们再进行实验看看有何不同。
[root@localhost ~]# a2="";a3=" ";a4=1; [root@localhost ~]# a1=${a1:-5};a2=${a2:-5};a3=${a3:-5};a4=${a4:-5}; [root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4} 5:5: :1有结果可以观察到,“:-”操作的覆盖状态延伸到了空值的身上,把未定义和空值状态的变量都进行了值覆盖,要注意区别两种操作。
(2)“+”/“:+” 下面我们对“+”/“:+”两个操作的执行效果进行实验
[root@localhost ~]# a2="";a3=" ";a4=1; [root@localhost ~]# a1=${a1+5};a2=${a2+5};a3=${a3+5};a4=${a4+5}; [root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4} :5:5:5可以观察到,“+”操作将不对未定义的变量进行影响,而将以存在的变量进行了覆盖。
[root@localhost ~]# a2="";a3=" ";a4=1; [root@localhost ~]# a1=${a1:+5};a2=${a2:+5};a3=${a3:+5};a4=${a4:+5}; [root@localhost ~]# echo ${a1}:${a2}:${a3}:${a4} ::5:5这次的实验是对“:-”进行实验,可以看到,该操作对未定义和空值变量不给予影响,而是将含空值和现有值的变量覆盖修改
操作未定义空值空白符有值-覆盖不不不:-覆盖覆盖不不+不覆盖覆盖覆盖:+不不覆盖覆盖暂时先对以上两种操作进行了分析,有兴趣的同学可以在对剩下的两种操作分别进行实验观察结果,虽然这几种操作对实际操作没有过多的帮助,但是确是十分有趣的。
三、变量的删除 删除变量的方法是运用unset命令
[root@localhost ~]# unset a但是要注意的是,这里的unset不能移除已经被定义为只读类型的变量,只得通过重启来重置变量。
以上便是对变量的浅层次认识,熟练的变量操作重要性不必再多叙,也希望各位能打实自己的基础,那样在后期的脚本编写中才能更顺畅。