日期:2014-05-16  浏览次数:20728 次

linux下shell脚本中环境变量和非环境变量的理解

linux下shell脚本中环境变量和非环境变量的理解

环境为:
Linux zhoumeng 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:50:42 UTC 2011 i686 i686 i386 GNU/Linux

ubuntu 11.10
有如下两个shell脚本:
A.sh:(调用B.sh)
1 #!/bin/bash
2 #program:
3 #this program shows how to write a script.
4 #History:
5 #2012/01/31 zhoumeng
6 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
7 export PATH
8 name=-al
9 #export name
10 echo -e "hello world!\a \n"
11 ./B.sh

B.sh:#(运行ls -al命令)
1 #!/bin/bash
2 #program:
3 #this program shows how to write a script.
4 #History:
5 #2012/01/31 zhoumeng
6 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
7 export PATH
8 ls $name

B.sh中引用了A.sh中的变量$name
运行情况:
一、运行命令:./A.sh
输出结果:
hello world!

deleteAllFileButOne.sh??? example.sh? helloworld.sh? pp.sh? sh05.sh? sh06.sh

可以看到B.sh中的命令 ls $name并没有成功执行,此时运行命令:echo $name 查看变量name的值,输出结果为空,也就是说此变量并没有设置

二、运行命令:. ./A.sh
输出结果:
hello world!

deleteAllFileButOne.sh??? example.sh? helloworld.sh? pp.sh? sh05.sh? sh06.sh

同样可以看到B.sh中的命令 ls $name并没有成功执行,但此时运行命令:echo $name 查看变量name的值,输出结果为:
-al
也就是说此变量设置成功

另,将A.sh中第9行 改为:export name,即,使这一句生效,同样按照以上两步骤运行
三、运行命令:./A.sh
输出结果:
hello world!

总用量 32
drwxrwxr-x? 2 zhoumeng zhoumeng 4096 2012-02-13 10:50 .
drwxr-xr-x 61 zhoumeng zhoumeng 4096 2012-02-13 08:39 ..
-rw-rw-r--? 1 zhoumeng zhoumeng? 248 2012-01-14 15:52 deleteAllFileButOne.sh
-rwxrwxr-x? 1 zhoumeng zhoumeng? 257 2012-02-13 10:50 example.sh
-rw-rw-r--? 1 zhoumeng zhoumeng? 476 2012-01-14 15:51 helloworld.sh
-rwxrwxrwx? 1 zhoumeng zhoumeng? 189 2012-02-13 10:22 pp.sh
-rw-rw-r--? 1 zhoumeng zhoumeng? 753 2012-01-31 11:33 sh05.sh
-rw-rw-r--? 1 zhoumeng zhoumeng? 428 2012-01-31 12:17 sh06.sh

B.sh中的命令 ls $name 执行成功了,此时运行echo $name,输出结果为:

此时为空,说明该变量并没有设置成功。

四、运行命令:. ./A.sh
输出结果:
hello world!

总用量 32
drwxrwxr-x? 2 zhoumeng zhoumeng 4096 2012-02-13 10:50 .
drwxr-xr-x 61 zhoumeng zhoumeng 4096 2012-02-13 08:39 ..
-rw-rw-r--? 1 zhoumeng zhoumeng? 248 2012-01-14 15:52 deleteAllFileButOne.sh
-rwxrwxr-x? 1 zhoumeng zhoumeng? 257 2012-02-13 10:50 example.sh
-rw-rw-r--? 1 zhoumeng zhoumeng? 476 2012-01-14 15:51 helloworld.sh
-rwxrwxrwx? 1 zhoumeng zhoumeng? 189 2012-02-13 10:22 pp.sh
-rw-rw-r--? 1 zhoumeng zhoumeng? 753 2012-01-31 11:33 sh05.sh

-rw-rw-r--? 1 zhoumeng zhoumeng? 428 2012-01-31 12:17 sh06.sh
B.sh中的命令 ls $name 执行成功了,此时运行echo $name,输出结果为:
-al
此变量设置成功

由以上可知:
bash程序中,子程序只能继承父程序的环境变量,不能共享父程序的自定义变量。若子程序使用父程序的变量,则该变量必须用export来更改为环境变量。
另:执行sh文件的方式:./A.sh 和? . ./A.sh在变量有效范围方面的区别
(一)./A.sh:程序中定义的变量(无论是否声明为环境变量还是非环境变量)只在该程序运行阶段有效,该程序运行结束后变量无效。
(二). ./A.sh:程序中定义的变量(无论是否声明为环境变量还是非环境变量)在整个终端都是有效,对于环境变量来讲,好像用 . 的方式将环境变量注册到系统一样,一直有效,直至该终端exit。 有以下验证:
另起一个终端:有以下输出
zhoumeng@zhoumeng:~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jdk_6u26/java-6-sun/bin:/home/zhoumeng/android_devople/android-sdk/platform-tools:/home/zhoumeng/android_devople/android-sdk/tools
zhoumeng@zhoumeng:~$ echo $name

zhoumeng@zhoumeng:~$ echo $me

可以看出上面的两个脚本程序中所用的环境变量和非环境变量对别的终端来说,均没有造成影响。