假如有脚本 first.sh:
#!/bin/bash
#------------------
#@file:first.sh
#------------------
echo 'your are in first file'
如何在其它 Shell 脚本中调用 first.sh 呢?
主要有三种方法:source、点号以及sh命令。
1.source
#!/bin/bash
#---------------
#@file:second.sh
#---------------
echo 'your are in second file'
source first.sh
2.点号.
#!/bin/bash
echo 'your are in second file'
. first.sh
注意,点号与脚本文件之间记得要有空格。
3.sh 命令
#!/bin/bash
echo 'your are in second file'
sh first.sh
三者输出的结果都是:
your are in second file
your are in first file
4.三者的区别
使用 source 命令和点号是等价的,类似于 C/C++ 中的 #include 预处理指令,都是将指定的脚本内容拷贝至当前的脚本中,由一个 Shell 进程来执行。
使用 sh 命令来调用另外的脚本和前面两种方法有着本质的区别。使用 sh 命令则会开启新的 Shell 进程来执行指定的脚本,这样的话,父进程的变量无法被子进程访问。
first.sh 内容如下,访问了 second.sh 中的变量 second。
#!/bin/bash
echo 'your are in first file'
echo 'second:' $second
second.sh 内容,通过上面介绍的三种方法来调用 first.sh,看看对 second.sh 的变量 second 访问有什么区别。
#!/bin/bash
second=lvlv
echo 'your are in second file'
source first
. first
sh first
程序的输出结果是:
your are in second file
your are in first file
second: lvlv
your are in first file
second: lvlv
your are in first file
second:
可见,使用 sh 命令开启一个子进程来调用指定的 Shell 脚本无法访问父进程的变量。
我们如何让子进程访问父进程的变量呢?
可以在父进程使用 export 命令设置临时环境变量。
5.export 设置临时环境变量
Shell 中按照变量的作用域和生命周期,Shell 变量可分为四类。
(1)永久环境变量
需要修改配置文件,环境变量永久生效。
(2)临时环境变量
使用 export 命令行声明即可,变量在shell脚本进程结束后仍然有效,但在关闭当前shell会话后失效。
(3)全局变量
在脚本中定义,仅在当前Shell脚本中有效,其他 Shell 脚本进程不能访问,其作用域从定义的位置开始,到脚本结束或被显示删除的地方为止。注意,全局变量既可以在Shell函数内定义,也可以在Shell函数外定义,因为Shell函数内定义的变量默认为 global,且作用域从函数被调用时执行变量定义的地方开始,到脚本结束或被显示删除的地方为止。
#!/bin/bash
globalVar=dablelv #全局变量
(4)局部变量
在 Shell 函数内显示使用 local 关键字定义的变量。其作用域局限于函数内。同名 local 变量会屏蔽 global 变量。
#!/bin/bash
function test() {
local localVar=dablelv #局部变量
}
test
echo $localVar #输出为空
所以,使用 export 申明的是临时环境变量,在当前 Shell 会话中,所有 Shell 实例都可以访问由 export 申明的临时环境变量。因为当前 Shell 会话中的所有 Shell 实例,都是当前 Shell 会话的子进程,所以可以与父进程一同访问环境变量。
second.sh 修改如下:
#!/bin/bash
export second=lvlv
echo 'your are in second file'
sh first.sh
执行 second.sh 将输出:
your are in second file
your are in first file
second: lvlv
至此,通过 export 命令设置临时环境变量的方式,使得 Shell 子进程能够访问父进程中的变量。
另外,如想删除已设置的环境变量,可以使用 unset(builtin)命令来清除环境变量 ,例如unset CLASSPATH
。
使用 readonly 命令可设置只读变量。如果使用了 readonly 命令的话,变量不可以被删除和修改。