shell的环境变量、全局变量、局部变量的区别

(1)局部变量:局部变量的作用域就是本函数(注意不是本文件,比本文件还小,是本函数内部),在函数外部想要使用这个局部变量,必须先调用函数,再使用变量。   

(2)全局变量:全局变量在当前整个shell进程中都有效,但不包括子shell进程。在shell命令行直接定义的变量或在文件中定义的变量默认就是全局变量(写法是 :变量=值)。这里就涉及到 ./a.sh 和 . ./a.sh(两个点之间有空格) 的区别的知识了(a.sh是文件名)。

       ./a.sh它其实是新建了一个子shell进程来执行这个文件,而 . ./a.sh 是在当前这个shell进程中直接执行这个文件。验证方法:写两个shell文件:4.sh、5.sh,里面都写:echo $$ 。这句代码的意思是输出当前shell进程的进程号。用./4.sh和./5.sh命令分别执行会发现这两个文件的输出结果不一样,因为它是生成了两个子shell进程来执行文件。

 

       而用. ./a.sh执行两个文件会发现它们的输出结果都一样,这就说明它就是直接在当前shell进程中执行的文件。   

 

       全局变量只在本shell进程中有效,不包括子shell,这也就是说,只要在当前shell进程中创建多个文件,在一个文件里定义的全局变量,可以在其它文件中直接使用,当然要先用 . ./a.sh方式执行文件。注意注意注意:这里有一个点:同进程中,一个可执行文件对其里面所定义的变量进行了修改,如果其它文件想要使用它里面刚刚修改过后的变量,必须先把这个文件运行一遍!!然后再使用。比如:vim 1.sh,在里面写:A=100 。然后退出。这里面定义的A就是个全局变量。 如果我们想在本shell进程的命令行或其它文件中直接用这个变量,比如直接进行输出:echo $A 。我们必须先 . ./1.sh,即把它先运行一次。  

(3)环境变量:全局变量只能在本进程中使用,但不包括子进程。如果想要父shell进程的子进程也能直接使用父shell进程定义的变量,就要把父进程定义的全局变量变成环境变量。具体语法是:export 变量名。这句话可以写的地方有三个:这三个地方的共同点就是都在父shell进程里:[1]:父shell进程的命令行里直接写这句话,比如 export A。这样在1.sh文件里定义的全局变量A就变成了环境变量。[2]:在1.sh文件里添加命令:export A。同样修改完以后,必须在命令行把这个文件再执行一遍才生效。[3]:同shell进程的其它文件里,也就是说,只要在同一个shell进程里,在随便一个可执行文件里写这句话,然后再在命令行里执行一下刚才写这句话的文件,它也可以生效。   进入子进程方法:在命令行写命令:bash 。这就是开启并进入一个子进程了。虽然看起来没变化。但其实已经进入了一个子进程,可以用命令:echo $$ ,会发现进程号不一样了。同样在子进程里继续写bash还可以进入子进程的子进程。 用exit可以退出当前进程,回到上一个进程。   在子进程可以直接使用父进程所定义的环境变量,环境变量只能向下继承,不能向上,即子进程定义的环境变量不能在父进程里使用。   同样环境变量只对当前shell窗口有用,如果新开一个终端窗口,就不管用了。          

(4):配置文件里的环境变量。前面所定义环境变量也只是一个临时的。在关闭了父进程后,这个环境变量也就消失了。(这也就是说,在下次开启一个shell,要再执行一次export A命令 ,以及再执行一次a.sh才能把A变成环境变量。前面忘了说,即使是全局变量,在新打开的shell窗口中,也要先执行以下定义这个变量的执行文件,然后再直接使用。不仅仅是修改了文件以后要再执行一次,在新打开shell窗口的时候也要重新执行)。同样环境变量也要再执行一下export命令。   要想一个变量在本系统的所有shell进程中都有效,就要把这个变量写到配置文件里,变成系统的环境变量。每个shell进程在启动时都会执行配置文件中的代码做一些初始化工作,如果将变量放在配置文件里,那么每次启动进程时都会定义这个变量,就可以直接使用了。

        在配置文件里写的环境变量也有两种:

       1:如果在Linux系统里安装了jdk。如果不修改系统的配置文件,查看java版本的命令:java -version,这个命令只能在你安装jdk的那个目录下使用。一旦切换了目录这个命令就不能使用了。要想在任何地方都能使用这个命令,我们就要在/etc/profile这个配置文件里添加环境变量。      它一共有两句:export JAVA_HOME=/usr/local/java/jdk1.8.0_261

第二句:export PATH=$JAVA_HOME/bin:$PATH        。这里第一句是定义了一个变量JAVA_HOME,然后它的值是一个目录,然后第二句是把$JAVA_HOME这个变量引入到了系统的PATH变量里去,它指定到了jdk安装路径的/bin目录下,这个目录里放了关于java的各种命令。然后后面的“ :$PATH ”是表示加上原来的系统变量$PATH,这一句一定要加,不然系统的PATH变量就只剩下$JAVA_HOME了,原来的都没了。然后再写命令:source  /etc/profile,让刚才写的环境变量生效。         这几句代码就使得我们可以在任何shell的任何目录下都能使用java的相关命令(只要是/usr/local/java/jdk1.8.0_261/bin 目录下有的)。

      2:如果仅仅是定义一个系统的环境变量,没有什么相关命令什么的,只写前面那个第一句代码就可以了,比如写一个:export A=100,  不用写第二句了,即不用把它引入到PATH里,因为它没有各种命令,  然后再写source /etc/profile 。这样在任何shell里都不用事先定义A变量了,直接写echo $A ,然后就能输出100。   这就是系统的环境变量。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值