您的位置:首页 > 运维架构 > Shell

linux的shell变量以及对set/env/export/unset/readonly命令的说明

2017-08-11 11:45 1066 查看
来源:
http://www.cnblogs.com/dongzhiquan/archive/2012/01/10/2317641.html#undefined http://blog.csdn.net/longxibendi/article/details/6125075
unix shell的变量分类

在Shell中有三种变量:内部变量,环境变量,用户变量。

内部变量:系统提供,不用定义,不能修改

环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环境变量.

用户变量:用户定义,可以修改

(1)内部变量(系统变量,环境变量,参数变量,预定义变量)

内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

即:位置变量。函数,脚本等都需要参数,位置变量就是用来获得这些参数的。相当于其它编程语言的形参。

比如:test.sh脚本,用命令“sh test.sh 1 2 3”执行该脚本,则位置变量$1指代1,$2指代2,$3指代4,$0指代脚本名称test.sh

   表示方法     描述

   $n     $1 表示第一个参数,$2 表示第二个参数 ...

   $#     命令行参数的个数或者说位置变量的个数

   $0     当前程序的名称或者说当前脚本文件名

   $?     前一个命令或函数的返回码

  $*       所有的位置变量(当然和$@还是有区别)

    $@      所有的位置变量(当然和$*还是有区别)

   $$     本程序的(进程ID号)PID

(2) 本地变量

即普通变量、用户变量、私有变量,在当前脚中定义的,仅当前脚本本可见,对引用该脚本的脚本也可见;

(3) 环境变量

Linux环境(也称为shell环境)由许多变量及这些变量的值组成,由这些变量和变量的值决定环境外观。这些变量就是环境变量。

包括两部分,一是,由系统设置的,主要包括: HOME,LOGNAME,MAIL,PATH,PS1,PWD,SHELL,TERM

二是,用户在命令行中设置的,使用export命令,但是用户注销时值将丢失

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

一.shell环境变量的分类以及set env export的区别:

 

set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样

env:显示(设置)用户变量变量

export:显示(设置)当前导出成用户变量的shell变量。

 

举个例子来讲:

  

[c-sharp] view
plain copy

[<a href="http://lib.csdn.net/base/oracle" class='replace_word' title="Oracle知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Oracle</a>@zhou3 ~]$ aaa=bbb --shell变量设定     

[<a href="http://lib.csdn.net/base/oracle" class='replace_word' title="Oracle知识库" target='_blank' style='color:#df3434; font-weight:bold;'>oracle</a>@zhou3 ~]$ echo $aaa      

bbb     

[oracle@zhou3 ~]$ env| grep aaa --设置完当前用户变量并没有     

[oracle@zhou3 ~]$ set| grep aaa  --shell变量有     

aaa=bbb     

[oracle@zhou3 ~]$ export| grep aaa --这个指的export也没导出,导出变量也没有     

[oracle@zhou3 ~]$ export aaa   --那么用export 导出一下     

[oracle@zhou3 ~]$ env| grep aaa  --发现用户变量内存在了     

aaa=bbb  

 
总结:Linux 分 shell变量(set),用户变量(env),
shell变量包含用户变量,export是一种命令工具,是显示那些通过export命令把shell变量中包含的用户变量导入给用户变量的那些变量.
 
二:使用unset命令来清除环境变量,注意set env  export设置的变量,都可以用unset来清除的

[c-sharp]
view plain
copy

清除环境变量的值用unset命令。如果未指定值,则该变量值将被 设为NULL。示  

例如下:    

$ export TEST="Test..." #增加一个环境变量TEST    

$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了    

TEST=Test...    

$ unset $TEST #删除环境变量TEST    

$ env|grep TEST #此命令没有输出,证明环境变量TEST已经不存在了  

 
三:使用readonly命令设置只读变量

[c-sharp] view
plain copy

使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:  

$ export TEST="Test..." #增加一个环境变量TEST  

$ readonly TEST #将环境变量TEST设为只读  

$ unset TEST #会发现此变量不能被删除  

-bash: unset: TEST: cannot unset: readonly variable  

$ TEST="New" #会发现此也变量不能被修改  

-bash: TEST: readonly variable  

 
四:最根本的设置、更改变量的配置文件 ~/.bash_profile   ~/.bashrc   ~/.bash_logout
~/.bash_profile  用户登录时被读取,其中包含的命令被执行
~/.bashrc  启动新的shell时被读取,并执行
~/.bash_logout  shell 登录退出时被读取
 
此外,shell(这里指bash)的初始化过程是这样的:

1.bash 检查文件/etc/profile 是否存在

2. 如果存在,bash 就读取该文件,否则,跳过

3.bash 检查主目录下的文件.bash_profile 是否存在。

4. 如果存在,bash 就读取該文件,否则,跳过

5.bash 检查主目录下的.bash_login 是否存在。

6. 如果存在,bash 就读取该文件,否则,跳过

7.bash 检查主目录下的文件.profile 是否存在

8. 如果存在, bash 就读取该文件,否则,跳过。

这些步骤都执行完后,就出现提示符了, ksh 默认提示符是 $.

 

 

五:常见的shell变量

PATH 这个变量包含了一系列由冒号分隔开的目录,系统就从这些目录里寻找可执行文件。如果你输入的可执行文件(例如ls、rc-update或者emerge) 不在这些目录中,系统就无法执行它(除非你输入这个命令的完整路径,如/bin/ls)。  

ROOTPATH 这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。  

LDPATH 这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。 

MANPATH 这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。  

INFODIR 这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。  

PAGER 这个变量包含了浏览文件内容的程序的路径(例如less或者more)。  

EDITOR 这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。  

KDEDIRS 这个变量包含了一系列用冒号隔开的目录,里面放的是KDE相关的资料。 

CONFIG_PROTECT 这个变量包含了一系列用空格隔开的目录,它们在更新的时候会被Portage保护起来。 

CONFIG_PROTECT_MASK 这个变量包含了一系列用空格隔开的目录,它们在更新的时候不会被Portage保护起来。

 
 
PATH:决定了shell将到哪些目录中寻找命令或程序

HOME:当前用户主目录

MAIL:是指当前用户的邮件存放目录。

SHELL:是指当前用户用的是哪种Shell。

HISTSIZE:是指保存历史命令记录的条数

LOGNAME:是指当前用户的登录名。 

HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。 

PS1:是基本提示符,对于root用户是#,对于普通用户是$。

PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt :) ”。 

# PS1=" Hello,My NewPrompt :) "
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息