Bash中变量的讨论

变量不管是在哪种开发语言中,都占有着举足轻重的位置,可以使我们的脚本更加灵活,也能提高其迁移性。对于变量的设置规范有了通透的了解之后,既能避免不必要的错误,也能保证脚本撰写的效率。因为往往一些莫名其妙的报错,都是由于不规范的变量设置引起的,左查右查,最终查出是由于书写不规范引起的,往往会气的发笑。
说了那么多,我就归结一些关于变量的知识


一、变量的设置
(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”的选项把变量类型转变为整数型,就可以正确的进行运算了,当然还有其他的一些选项。

  1. -i :定义成为整数数字类型
  2. -x :定义为环境变量;
  3. -r :将变量设置成为只读类型
  4. -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不能移除已经被定义为只读类型的变量,只得通过重启来重置变量。

以上便是对变量的浅层次认识,熟练的变量操作重要性不必再多叙,也希望各位能打实自己的基础,那样在后期的脚本编写中才能更顺畅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值