分享

shell中的变量

 jiffes 2016-01-14
shell中的变量 2013-11-04 10:43:28

分类: 嵌入式

1、变量的替换
    变量的名字就是变量保存值的地方,引用变量的值就叫做变量替换。
    变量"裸体"出现的时候,也就是说没有$前缀的时候,那么变量可能存在如下几种情况。
    变量被声明或被赋值, 变量被unset, 变量被exporte, 或者是变量处在一种特殊的情况,变量
    代表一种信号。
    例: 设var是一个变量的名字,  那么$var就是引用这个变量的值, 即变量替换。
    注意:$var事实上只是${var}的简写形式. 在某些上下文中$var可能会引起错误,这时候你就需要用${var}了。
    例:当一个shellscript运行时传入参数大于9个的时候,对后面的参数的引用就需要使用${varible_name}的形式
        #!/bin/sh                        #!/bin/bash    
        echo $9                            echo $9
        echo $10                        echo $10
        echo ${10}                        echo ${10}
        这样分别运行两个脚本
        bash$  ./test.sh   123 2 3 4 5 6 7 8 9 10
        左边运行结果                    右边运行结果
        9                                9
        10                                1230
        10                                10
        说明sh解析器与bash解析器是有所区别的,前者可以正确引用$10而后者必须使用${10}这种形式来引用,否则
        在bash解析器下$10将被解析为$1在加上后面的字符。
    注:一个未初始化的变量将会是"null"值,就是未赋值(但并不是代表值是0),在给变量赋值之前就使用这个变量
    通常都会引起问题,但是在执行算术操作的时候, 仍然有可能使用未初始化过的变量,这个时候有时未初始化的变量
    将被以0值参加运算,但是这是一个没有标准化的例子,也就是不同的解释器将做不同的处理。
    
2、变量的赋值
    赋值操作(前后都不能有空白),另外=和-eq都可以用做条件测试操作, 请不要与这里的赋值操作相混淆。
    还有就是注意命令替换型的赋值操作,是直接将命令的输出结果赋值给一个变量。

3、bash变量的类型
    与C语言和其他编程语言不同,Bash并不对变量区分"类型", 本质上, Bash变量都是字符串。 但是依赖于具体
    的上下文, Bash也允许比较操作和整数操作。其中的关键因素就是, 变量中的值是否只有数字。
    不区分变量的类型既是幸运的事情也是悲惨的事情。 它允许你在编写脚本的时候更加的灵活(但是也足够把你搞晕!),
    并且可以让你能够更容易的编写代码。 然而, 这也很容易产生错误, 并且让你养成糟糕的编程习惯。
    
4、局部变量与环境变量
    局部变量,这种变量只有在代码块或者函数中才可见。
    环境变量,这种变量将影响用户接口和shell的行为,在通常情况下, 每个进程都有自己的"环境", 这个环境是
    由一组变量组成的, 这些变量中存有进程可能需要引用的信息。 在这种情况下, shell与一个一般的进程没什
    么区别。每次当一个shell启动时, 它都将创建适合于自己环境变量的shell变量。更新或者添加一个新的环境
    变量的话, 这个shell都会立刻更新它自己的环境(换句话说, 更改或增加的变量会立即生效), 并且所有的shell子
    进程(即这个shell所执行的命令)都会继承这个环境. (准确地说,应该是后继生成的子进程才会继承Shell的新
    环境变量, 已经运行的子进程并不会得到它的新环境变量)。
    分配给环境变量的空间是有限的. 创建太多环境变量, 或者给一个环境变量分配太多的空间都会引起错误。
    
    如果一个脚本要设置一个环境变量, 那么需要将这些变量"export"出来, 也就是需要通知到脚本本地的环境.
    这是export命令的功能.一个脚本只能够export变量到这个脚本所产生的子进程, 也就是说只能够对这个脚本
    所产生的命令和进程起作用. 如果脚本是从命令行中调用的, 那么这个脚本所export的变量是不能影响命
    令行环境的. 也就是说, 子进程是不能够export变量来影响产生自己的父进程的环境的。
    
    总结:局部变量,这种变量只有在代码块或者函数中才可见。
          环境变量,影响用户接口和shell的行为的一组变量。更该环境变量,会立刻生效。
          脚本中后继生成的子进程才会继承Shell的新环境变量, 已经运行的子进程并不会得到它的新环境变量。
          创建太多环境变量, 或者给一个环境变量分配太多的空间都会引起错误。
          子进程是不能够export变量来影响产生自己的父进程的环境的。
   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多