Intro
活用变量,用好变量,可以在编程中节省很多不必要的代码,而且,关于变量,诸如变量展开,变量判断等,也是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,即空值。
某些情况下,未定义的变量可能会造成一定隐患,比如rm -rf /$DIR,且DIR未定义。
-
$ a=1 b=2 d=3
-
$ echo "$a$b$c$d" #c未定义就被引用,此时c值是null
-
123
unset(built-in)
用unset可以删除变量,置变量为“未定义”的状态。-f指定的是变量,不是函数
For each name, remove the corresponding variable or function
-
$ set -u #加限制
-
$ m=has_a_name #m赋值
-
$ unset m #取消m
-
$ echo $m #set会报错 unbound variable
-
$ unset -f sub #取消函数sub
很少有场景会严格区分"变量未定义"和"已定义但为空"的情况,一般情况下,使用两者并无区别。
set -u(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数据类型,空值就是""。
---
位置参数
附:shell未严格区分未定义和空值的情况,但在其他脚本语言比如perl中,严格把未定义变量看成undef数据类型,空值就是""。
---
模式匹配运算符
这里的模式是通配符(globbings),不是正则表达式。
范例:
原变量PATH
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
从左到右最短匹配删除
${PATH#*sbin:}
得/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin,删除了/usr/local/sbin:
从左到右最长匹配删除
${PATH##*sbin:}
得/usr/bin:/root/bin,删除了/usr/local/bin:/sbin:/bin:/usr/sbin:
从右往左最短匹配删除
${PATH%:*bin} 同 ${PATH%:*}
得/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin,删除了:/root/bin
从右往左最长匹配删除
${PATH%%:*}
得/usr/local/sbin,删除了:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
从少替换
${PATH/sbin/SBIN}
得/usr/local/SBIN:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
全局替换
${PATH//sbin/SBIN}
得/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:/usr/SBIN:/usr/bin:/root/bin
---
字串长度
${#var}返回var的字符数(长度)
---
变量测试和默认值设置
常用场景:当变量没有设置或为空串时,设置为默认值'default',当为非空值时,保留原值。可以用if then lese等价。
当var未设置或为空,设置默认值
var=${var:-default}
当var仅仅未设置时,设置默认值
var=${var-default}
除了'-'号,还有'+','='符号,都可以用if代替,仅记录最常用的空值判断‘-’号。
---
位置参数
提供了访问命令行参数或函数参数的能力,$1, $2, $3.. $9, ${10}...
$0 脚本自身文件名
$# 参数数量(不含$0)
$*,$@ 所有参数,以IFS(默认空白)分割
"$*" 所有参数的归并,视作一个字串, "$1 $2 $3"
"$@" 最佳方式,不丢失参数内的空白
比如
-
$foo cn us "jp ko"
-
$# is 3
-
$0 is variable.sh
-
$* =>
-
cn
-
us
-
jp
-
ko
-
$@ =>
-
cn
-
us
-
jp
-
ko
-
"$*" =>
-
cn us jp ko
-
"$@" =>
-
cn
-
us
-
jp ko
---
算数展开$((..))
算数展开,一种类似c的计算变量的值的方式。
a=2 b=3
算数
$(( a + b )) 得 5
自增
$(( a++ )) 得a=3
比较(算数展开0为假,非0值为真)
$(( a > b )) 得0, 假
$(( a && b )) 得1, 真
$(( 1==1 && 2>4 ) 得0,假
$(( 1==1 || 2>4 ) 得1,真
赋值
$(( a = 9 )),a=9赋值完毕,并返回9
$(( a+= 2 )), a=11赋值完毕,并返回11
自增
$(( a++ )) 得a=3
比较(算数展开0为假,非0值为真)
$(( a > b )) 得0, 假
$(( a && b )) 得1, 真
$(( 1==1 && 2>4 ) 得0,假
$(( 1==1 || 2>4 ) 得1,真
阅读(1692) | 评论(0) | 转发(0) |