一、什么是变量
在shell中有一个重要的概念,就是变量,顾名思义,变量就是变动的值,就是以特定的字符串来表示一个不定的内容。
比如说我们用PWD命令查看当前目录,我们可能一致在切换文件夹,但是PWD却能正确显示我们所在的目录。
再比如我们以不同身份登录系统的时候,系统怎么知道我是哪个用户,有什么权限,这都是和一个叫UID的变量息息相关的。
二、变量分类
变量分为环境变量和shell变量
环境变量相当于全局变量,适用于当前SHELL(父进程)和由父进程调用的子进程,如打开编辑器vi、脚本、应用或是再打开一个子shell。
shell变量就是当前shell使用的变量了,它只是“本地“有效,相当于本地变量,不适用于其他子进程,只在当前shell生命周期内有效
三、变量相关的命令
既然变量这么重要,那我们怎么去增、删、改、查呢?
查看:
env 查看环境变量
set 查看shell变量和环境变量
echo $变量名 查看某个特定的变量,如echo $LANG就可以查看当前系统的语系编码
export 查看已经转换成环境变量的SHELL变量
增加:
1、变量名=不定值,如LANG=zh_CN.utf8
2、export 变量名=“不定值”,如export LANG="zh_CN.utf8",这样就直接变成环境变量了
删除:unset 变量名,如unset LANG,LANG就失去了变量的身份,echo LANG就没有内容了
转换:export 变量名,将shell变量转变成环境变量
只读:readonly 变量名,如readonly LANG,那么后面再修改LANG的值或是删除就不被允许了,那只好注销了。
这些是一些比较重要的指令,其他指令请参考google和man
四、login shell 和 no-login shell
为什么提这两个?他们又是什么?
这对第五段的永久变量和临时变量的设置很有帮助。
login shell就是使用之前我们还需要输入帐号密码,比如我们使用tty1~tty6登入时。
no-login shell当然就是不用登入了,比如我们用图形化进入系统后直接点开终端程序或者在shell里直接输入bash命令。
login shell使用时要加载的大致步骤如下:
第一步:载入全局配置文件
/etc/profile 对所有用户有效,修改后使用source /etc/profile使其立即生效
/etc/inputrc 自定义案件输入功能,由profile调入
/etc/profile.d/*sh 各种其他设置:语言、VIM、颜色,由profile调入
/etc/sysconfig/i18n,由上一个文件夹中的/etc/profile.d/lang.sh调入
第二步:载入个人配置文件
~/.bash_profile 只对login shell有效,对当前用户有效,也必须用souce导入
调用~/.bashrc,其作用是个人指令别名和调用/etc/bashrc
而/etc/bashrc的作用有:根据UID得到umask和PS1的值,然后去调用/etc/profile.d/*sh中其他各项设置
~/.bash_login
~/.profile
这三者是以以上顺序执行,若成功则不往下走
no-longin shell只会读取~/.bashrc.
如果不小心删除了这个文件,进入BASH后的提示值就变成bash-4.1$,4.1应该是bash版本号。
只需要把/etc/skel/.bashrc拷贝一份过来,然后使用source命令或重启SHELL即可生效
当然上面这些是登录SHELL时比较重要的配置文件,还有其他配置文件和其有关系,例如:
~/.bash_history 历史指令
~/.bash_logout 退出时要执行的任务
五、永久变量和临时变量
由上面的内容可知,不管是自定义的变量还是通过export导为环境变量的自定义变量都只是在shell生命周期内有效,这样的变量就是临时变量,如果我想设置一个变量使其永久生效怎么办呢?
根据第四段的分析可以修改两个配置文件:/etc/profile和~/.bashrc,前者对所有用户有效,后者只对当前用户有效。添加的内容详见第三段。
注:以上内容是基于CentOS6.3,其他版本目录可能和这里提到的有些出入。