跟我一起写Shell脚本之六---变量(3 环境变量)

环境变量其实就是全局变量。

1、常用的环境变量

HOME用户主目录的完整路径
PATH用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
SHELL当前用户使用的Shell
UID当前用户的UID
LOGNAME当前用户的登录名
HOSTNAME主机名称
HISTSIZEhistory命令最大记录的条数

2、查看环境变量

可以用env命令查看所有环境变量。

也可以用set命令查看,只是set查看的是所有环境变量+自定义变量。

3、用export将自定义变量转成环境变量

1)自定义的变量,在其子程序里是不会继承的

我们举个例子,在shell里输入:

$ MY="good"
$ echo $MY
good

然后我们创建文件009_envvar.sh:

#!/bin/bash

echo "Test export var"
echo $MY

然后执行结果如下:

$ sh 009_envvar.sh 
Test export var

$

可见刚才定义的变量MY在009_envvar.sh里是不可见的。

2)export后的自定义的变量,在其子程序里是会继承的

刚才的例子我们继续执行:

$ export MY="good!"
$ sh 009_envvar.sh 
Test export var
good!

由此看,一旦export出来某个变量,那么其子程序就可以拿到这个变量了。

3)在子程序export后的自定义变量,其他子程序里是不能继承的

假如我们将刚才的export MY="good!",写进一个脚本执行,会怎样呢?

我们新建立一个文件010_envvar.sh:

#!/bin/bash

echo "export MY"
export MY="good!!!"

我们重新开一个终端(原因是避免之前设置的各种变量的影响),然后顺序执行010和009两个脚本:

$ sh 010_envvar.sh 
export MY
$ sh 009_envvar.sh 
Test export var

由此看009这个脚本没有拿到MY变量的值。

4)source命令

我们重新开一个终端,然后用如下命令执行010和009两个脚本:

$ source 010_envvar.sh 
export MY
$ sh 009_envvar.sh 
Test export var
good!!!
$

由此看,source过010_envvar.sh以后,009_envvar.sh就能拿到MY的值了。

4、用unset删除全局变量

$ export AAAA="myownown"
$ echo $AAAA
myownown
$ unset AAAA
$ echo $AAAA

5、设置系统环境变量相关的文件

系统环境变量是在shell启动过程中执行相关的文件定义的,这些文件被称为shell启动文件。不过我们在设置系统环境变量的时候,我们要区分登录式shell、非登录式shell、交互式shell、非交互式shell的区别,(登录/非登录和交互/非交互只是划分的标准不一样)只有弄清除了不同模式的shell才能正确修改相应的shell启动文件以至于能够正确设置系统环境变量。

1)登录式Shell

登录式shell是用户需要输入用户名和密码的shell,该模式的shell启动过程中会依次执行下列文件:      

/etc/profile    # 登录bash shell的默认主启动文件。任何用户登录shell都会执行此启动文件。不建议修改

~/.bash_profile  

~/.bash_login

~/.profile      # 上诉这三个$HOME启动文件是定义对应用户的环境变量。不同linux发行版使用的文件不同 

2)非登录式Shell

登录式shell是需要输入用户名、密码登录的shell,而非登录式shell则是不需要的,例如直接在命令行输入bash、在图形化界面点击open in terminal开启命令行终端等都是非登录式shell。

另外,对于退出shell的命令exit和logout的区别,exit命令可以退出登录式shell和非登录式shell,logout只能退出登录式shell。

$ bash
$ logout
bash: logout: not login shell: use `exit'

我们可以通过$0变量值来查看是登录式shell还是非登录式shell,登录式shell会在前面显示‘-’非登录式shell则没有。

例如我的非登录式Shell的结果:

$ echo $0
bash

在非登录式shell的启动过程中,由于不需要重复的登录shell,所以非登录shell只需要执行下列文件即可,

$~/.bashrc

 

3)交互式Shell

我们可以利用$-的变量值来查看当前shell是交互式还是非交互式的:

$ echo $-
himBH

有i,说明是交互(interactive)式的。

在交互式shell下,bash不会执行/etc/profile文件,代替而之的是$HOME/.bashrc文件,执行的启动文件和非登录式shell一样。

4)非交互式Shell

和交互式shell相反,该模式下shell不与终端进行交互,例如以shell脚本的方式读取脚本中命令,而不需要与终端交互(除非需要用户输入参数的命令),当文件结束时,该shell也就退出了。

非交互式shell的相关启动文件和系统设置的一个全局环境变量BASH_ENV相关。该变量默认情况下没有定义。我们需要手动设置该变量,当执行shell脚本的时候,会执行该变量指向的文件。

 

好了,今天的部分就到这里了,接下来的Shell脚本之旅会更久精彩!

===================================================================================

注意:本文为本人原创,版权所属为个人所有,欢迎转载,但是转载请注明出处。

===================================================================================

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值