变量引用的作用域那么在定义了变量之后,如何打印变量的值呢?这是一个如何引用变量的示例。${变量名}作为变量的引用echo${变量名}查看变量的值${变量名}在某些情况下可以省略为$变量名[root@lincoding~]#string="helloShell"[root@lincoding~]#echo${string}helloShell[root@lincoding~]#echo$stringhelloShell那么花括号括起来的变量和没有花括号的变量有什么区别呢?[root@lincoding~]#echo$string9[root@lincoding~]#echo${string}9helloShell9可以发现string变量被引号后加了一个9,不带花括号的引用会把string9当作一个变量name,如果有带花括号的引号,打印字符串变量后,会在末尾额外添加9个变量。我们定义的变量的默认作用域只会在当前的shell环境中生效。好的变量是无效的。我们在shell脚本中定义了一个变量str#!/bin/bashstr="myshell"echo${str}。执行shell脚本时,会打印shell脚本中定义的变量值。当前终端引用shell脚本的变量并打印一个空值。[root@lincoding~]#./test.shmyshell[root@lincoding~]#echo${str}[root@lincoding~]#说明变量str的作用域只在shell脚本中。如果在终端中定义了一个变量,在shell脚本中引用该变量是否生效?[root@lincoding~]#mystr="abc"[root@lincoding~]#cattest.sh#!/bin/bashecho${mystr}[root@lincoding~]#./test.sh[root@lincoding~]#bashtest.sh[root@lincoding~]#.test.shabc[root@lincoding~]#sourcetest.shabc使用四种执行方式来运行脚本,这四种执行方式的影响也在前面章节详细解释。方法一和方法二会生成一个子进程来执行脚本。由于当前终端定义的变量作用域只在当前终端内,所以子进程引用的父进程定义的变量不会生效。方法三和方法四不生成子流程,而是直接在当??前终端环境中执行脚本,所以也在变量范围内,所以对变量的引用是有效的。export导出变量假设你想让父进程定义的变量在子进程或者子shell中同时生效,那么就需要使用export来导出变量。具体方法如下:[root@lincoding~]#mystr="abc"[root@lincoding~]#bashtest.sh[root@lincoding~]#exportmystr[root@lincoding~]#bashtest.shabc[root@lincoding~]#./test.shabc使用export后可以看到,终端定义变量,test.sh脚本中引用的变量有效。也就是说,子进程可以获得父进程定义的变量的值。如果用完这个变量,想清除它,可以使用unset[root@lincoding~]#unsetmystr[root@lincoding~]#echo${mystr}[root@lincoding~]#Summary的默认作用域该变量是对于shell本身而言,如果我们要为子shell或子进程使用父进程的变量,需要使用export变量名关键字来导出变量。如果变量不再被使用,我们必须及时使用未设置的变量名来清除变量的值。
