导言 css
有人会问,变量有什么好说的。顶多赋值一下,引用一下咯。其实否则,活用变量,用好变量,能够在编程中节省不少没必要要的代码,并且,关于变量,诸如变量展开,变量判断等,也是shell编程重要的基本功之一。
SHELL变量
变量(variable)是计算机内存中可存储值的一块空间,变量名就是这块空间的名字,变量必定有一个值,这个值就写在这块内存空间内。
shell是一种弱类型的编程语言,不强制要求声明变量类型,事实上,shell变量类型可看作是字串string或者整数int(其实也没区别)。
变量声明和赋值
赋值的时候注意,=符号两旁没有任何空格。
- $ var=some_value #默认完成变量的声明和赋值
- ----------------------------------------
- $ var="some important value" #须要引号圈引带有空格的字串
- ----------------------------------------
- $ var1=a var2=b var3=$var1 #同一行完成多变量赋值
- $ eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` #经典案例:同时把MONTH DATE HOUR变量赋值完毕
- $ echo $MONTH $DATE $HOUR
- 201212 20121208 12
变量的引用
变量名var表明变量自己,$var表明变量值,${var}等价。
特别注意有时候,必须使用${var_name}的形式,否则会有歧义。
- $ var=abc
- $ echo $var #方法1,输出abc
- $ echo ${var} #方法2,等效
- $ echo "${var}" #方法3,等效
- --------------------------------------
- echo $varvar #输出空,找不到varvar变量
- echo ${var}var #输出abcvar,注意
- --------------------------------------
- var_another=$var #完成值引用
关于未定义变量和空变量
shell里面,容许变量为空。空值指变量"不含任何字符",等价于,"变量长度为0"。空值记为null。
当引用一个从未出现的变量时,shell判断为未定义。直到下次赋值前,变量值默认被设为null,即空值。
- $ a=1 b=2 d=3
- $ echo "$a$b$c$d" #c未定义就被引用,此时c值是空
- 123
unset(built-in)
用unset能够删除变量,重置变量为“未定义”的状态。
For each name, remove the corresponding variable or function
- $ m=has_a_name #m赋值
- $ unset m #取消m
- $ echo $m #null
不多有场景会严格区分"变量未定义"和"已定义但为空"的状况,通常状况下,使用二者并没有区别。
但某些状况下,未定义的变量可能会形成必定隐患,好比rm -rf /$DIR,且DIR未定义。
set(built-in)
若是想避免使用未定义变量的话,请在脚本开头加上set -u,即“不使用未定义的变量”。
- set -u
- x="" #x是空值,已定义
- y= #y是空值,已定义
- echo $x$y$z #z是未定义,此时z值为空(null)。
- -bash: z: unbound variable #不容许使用z
- -------------------------------------------
- unset y
- echo $x$y
- --bash: y: unbound variable #unset是删除,而非清空。
附:顺便说一句,shell未严格区分未定义和空值的状况,但在其余脚本语言好比perl中,严格把未定义变量当作undef数据类型,空值就是""。
其余
先写些基本的,而后深刻谈论变量替换等深刻内容。
技巧
- eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` ,eval和赋值的经典案例:同时把MONTH DATE HOUR变量赋值完毕;
- unset用来删除变量,而非清空变量;
- set -u 设置后能够防止使用未定义的变量。