shell脚本编程<先导>:环境变量

时间:2021-03-02 06:24:36

bash shell使用一种称为环境变量的特性来存储关于会话和工作环境的信息,许多程序和脚本都使用环境变量来获取系统信息并存储临时数据和配置信息。
其中bash shell中有两种类型的环境变量:
1. 全局变量
2. 本地变量

全局环境变量

全局环境变量shell会话和该shell产生的任何子进程(当然包括子shell)中都可见。在产生父进程信息的子进程的应用程序中,这便显示了全局变量的重要性,若要查看全局环境变量,使用printenv命令。bash shell设置了很多全局环境变量,其中大多数由系统在登陆过程中设置。

本地环境变量

本地环境变量只在定义它们的本地进程中可见。Linux默认设置了一些本地环境变量。使用set命令可以查看特定进程的所有环境变量,包括全局环境变量

设置本地环境变量

方法是使用等号将变量指定为具体值,如下即可

test=testing
echo $test
#则会显示testing

本地环境变量最好设置为小写字母,设置了本地环境变量,可以在shell进程的任何地方使用它。但是,产生了另一个shell,则不能使用。类似的,若在子进程设置了本地环境变量,一旦离开了子进程,本地环境变量将不可用;

设置全局环境变量

方法:创建一个本地环境变量,然后再将它导入到全局环境中,可以通过export命令来完成全局环境变量的设置

test=testing
export $test

移除环境变量

可以可以通过unset命令来删除已有的环境变量,如下

test=testing
echo $test
unset test

注意:
1. 没有$符号
2. 若是删除全局变量时,需要注意,如果你在子进程中使用unset移除全局环境变量,则该操作只对子进程有效。全局环境变量在父进程中仍有效

设置PATH环境变量

当你在shell名利行界面(CLI)中输入命令时,shell必须搜索系统以找到命令,PATH环境变量定义了它搜索命令的目录。
设置(添加)PATH变量的方法有三种:
方法1:

PATH=$PATH:/home/david/test
这种方法只对当前会话有效,当退出或注销系统后,PATH设置就会恢复原有设置

方法2:修改/etc/proflie,在里面更改PATH.这种会永远生效
方法3:修改当前目录中下的.bash_profile。把用户想添加的路径加到PATH后面即可,这种方法只对用户起作用

定位系统环境变量

通过登录Linux启动bash shell时,bash将默认检查一些文件以执行命令,这些文件称为启动文件。有三种方法启动bash shell:
1. 登录时作为默认登录shell
2. 作为非登录时的交互式shell
3. 作为非交互式shell运行脚本

登录shell

当登录到Linux时,bash shell将作为登录shell启动,登录shell将查找4个不同的启动文件来处理,bash shell处理文件的顺序如下:
1. /etc/profile (bash shell在系统上的默认启动文件)
2. $HOME/.bash_profile
3. $HOME/.bash_login
4. $HOME/.profile
另外三个启动文件特定于各个用户,并且可以根据用户需求自定义它们,大多数系统都只使用这三个之一

/etc/profile

可以看见该文件底部有一个export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL ,这将确保这些环境变量对于由登录shell生成的子进程都可以用,
/etc/profile文件还迭代了/etc/profile.d目录中的任何文件的for语句。

交互式shell

如果启动了一个bash shell,而没有登录系统(如在CLI提示符中键入bash),则启动了一个交互式shell,交互式shell与登录shell的行为不一样
如果bash作为交互式shell启动,它不会处理/etc/profile文件,相反,它将检查用户HOME目录中的.bashrc
.bashrc文件执行两个任务,首先,它将检查/etc目录中的公共bashrc文件。其次,它为用户输入个人别名和私有脚本函数提供了地方

变量数组

其实变量数组不常用,了解下
环境变量的数组索引值以0开始,使用如下

mytest=(one two three four five)
#打印one
echo $mytest
#打印three
echo ${mytest[2]}
#打印one two three four five
echo ${mytest[*]}
#还可以单独赋值,将打印one two seven four five
mytest[2]=seven
echo ${mytest[*]}
#移除,
unset mytest[2]
echo ${mytest[*]} #打印one two four five
echo $mytest[2] #不打印
echo $mytest[3] #打印four
#移除整个数组
unset mytest
echo $mytest #不打印

使用变量别名

使用alias命令,若要查看活动别名的列表,可以使用带-p参数的
也可以使用alias创建自己的别名

alias li='ls -il'

注意命名别名于本地环境变量的行为相似,它们只对于定义范围内的shell进程有效
在启动新的交互式shell时,bash shell始终会读取$HOME/.bashrc启动文件,这是放置命名别名的最佳位置