Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135161
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: Python/Ruby

2012-12-08 12:37:44

Intro
活用变量,用好变量,可以在编程中节省很多不必要的代码,而且,关于变量,诸如变量展开,变量判断等,也是shell编程重要的基本功之一。

SHELL变量
变量(variable)是计算机内存中可存储值的一块空间,变量名就是这块空间的名字,变量一定有一个值,这个值就写在这块内存空间内。
shell是一种弱类型的编程语言,不强制要求声明变量类型,事实上,shell变量类型可看做是字串string或者整数int。

变量声明和赋值
赋值的时候注意,=符号两旁没有任何空格。
  1. $ var=some_value                      #默认完成变量的声明和赋值
  2. ----------------------------------------
  3. $ var="some important value"         #需要引号圈引带有空格的字串
  4. ----------------------------------------
  5. $ var1=a var2=b var3=$var1               #同一行完成多变量赋值
  6. $ eval `date -d '1 hours ago' +"MONTH=%Y%m DATE=%Y%m%d HOUR=%H"` #经典案例:同时把MONTH DATE HOUR变量赋值完毕
  7. $ echo $MONTH $DATE $HOUR
  8. 201212 20121208 12
变量的引用
变量名var代表变量本身,$var代表变量值,${var}等价。
特别注意有时候,必须使用${var_name}的形式,不然会有歧义。
  1. $ var=abc
  2. $ echo $var #方法1,输出abc
  3. $ echo ${var} #方法2,等效
  4. $ echo "${var}" #方法3,等效
  5. --------------------------------------
  6. echo $varvar #输出空,找不到varvar变量
  7. echo ${var}var #输出abcvar,注意
  8. --------------------------------------
  9. var_another=$var #完成值引用
---
关于未定义变量和空变量
shell里面,允许变量为空。空值指变量"不含任何字符",等价于,"变量长度为0"。空值记为null。
当引用一个从未出现的变量时,shell判断它为未定义。直到下次赋值前,变量值默认被设为null,即空值。
某些情况下,未定义的变量可能会造成一定隐患,比如rm -rf /$DIR,且DIR未定义
  1. a=b=2 d=3
  1. $ echo "$a$b$c$d" #c未定义就被引用,此时c值是null
  2. 123
unset(built-in)
unset可以删除变量,置变量为“未定义”的状态。-f指定的是变量,不是函数
For each name, remove the corresponding variable or function
  1. $ set -u    #加限制
  2. $ m=has_a_name #m赋值
  3. $ unset m #取消m
  4. $ echo $m #set会报错 unbound variable
  5. $ unset -f sub    #取消函数sub
很少有场景会严格区分"变量未定义"和"已定义但为空"的情况,一般情况下,使用两者并无区别。
set -u(built-in)
如果想避免使用未定义变量的话,请在脚本开头加上set -u,即“未定义的变量不能被引用”,即一定要先赋值变量才可以引用。
  1. set -u
  2. x=""                 #x是空值,已定义
  3. y=                   #y是空值,已定义
  4. echo $x$y$z          #z是未定义,此时z值为空(null)
  5. -bash: z: unbound variable #不允许使用z
  6. -------------------------------------------
  7. unset y
  8. echo $x$y
  9. --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"
    "$@"  最佳方式,不丢失参数内的空白
比如
    
  1. $foo cn us "jp ko"
  2. $# is 3
  3. $0 is variable.sh
  4. $* =>
  5. cn
  6. us
  7. jp
  8. ko
  9. $@ =>
  10. cn
  11. us
  12. jp
  13. ko
  14. "$*" =>
  15. cn us jp ko
  16. "$@" =>
  17. cn
  18. us
  19. 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) |
给主人留下些什么吧!~~