linux中set、unset、export、env、declare,readonly的区别以及用法

  
  set命令显示当前shell的变量,包括当前用户的变量;
 
  env命令显示当前用户的变量;
 
  export命令显示当前导出成用户变量的shell变量。
 
        每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你用什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,
 
  但shell自己的变量不同shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变量可以通过export “导出”变成一个用户变量。
 

0.declare 命令

  declare命令用于 声明和显示已存在的shell变量。当不提供变量名参数时显示所有shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。declare的功能与typeset命令的功能是相同的。
 
语法:
declare(选项)(参数)

 选项:

+/-:"-"可用来指定变量的属性,"+"则是取消变量所设的属性;
-f:仅显示函数;
r:将变量设置为只读;
x:指定的变量会成为环境变量,可供shell以外的程序来使用;
i:[设置值]可以是数值,字符串或运算式。

参数:

shell变量:声明shell变量,格式为“变量名=值”。
 
主要作用就是声明shell变量:  declare var=value,与之等价的功能是 var=value   ,另外还有一个与之等价的功能 typeset var=value
例如: 三种声明shell变量的方式
[root@VM_0_12_centos ~]# var1=var1value
[root@VM_0_12_centos ~]# declare var2=var2value
[root@VM_0_12_centos ~]# typeset var3=var3value
[root@VM_0_12_centos ~]# echo $var1
var1value
[root@VM_0_12_centos ~]# echo $var2
var2value
[root@VM_0_12_centos ~]# echo $var3
var3value
declare -x将shell变量输出到环境变量
[root@VM_0_12_centos ~]# declare -x var1=value1
[root@VM_0_12_centos ~]# env | grep var1
var1=value1
 

1.unset命令

  unset命令用于 删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。
语法:
unset(选项)(参数)

 选项:

-f:仅删除函数;
-v:仅删除变量。
参数:
shell变量或函数:指定要删除的shell变量或shell函数。

例如:删除上面的var1,var2,var3,其中var1已经输出为环境变量,var2和var3为普通shell变量。

[root@VM_0_12_centos ~]# echo $var1
value1
[root@VM_0_12_centos ~]# echo $var2
var2value
[root@VM_0_12_centos ~]# echo $var3
var3value
[root@VM_0_12_centos ~]# env | grep var1  #证明var1为环境变量
var1=value1
[root@VM_0_12_centos ~]# env | grep var2
[root@VM_0_12_centos ~]# env | grep var3
[root@VM_0_12_centos ~]# unset var1
[root@VM_0_12_centos ~]# unset var2
[root@VM_0_12_centos ~]# unset var3
[root@VM_0_12_centos ~]# env | grep var2
[root@VM_0_12_centos ~]# env | grep var1
[root@VM_0_12_centos ~]# echo $var3

添加一个环境变量并设置为只读删除不了环境变量

[root@VM_0_12_centos ~]# declare -x var6=value6  #声明一个变量并输出到环境变量
[root@VM_0_12_centos ~]# env | grep var6
var6=value6
[root@VM_0_12_centos ~]# readonly var6  #设置为只读
[root@VM_0_12_centos ~]# unset var6
-bash: unset: var6: cannot unset: readonly variable
 

2.Set命令

  set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

语法:

set(选项)(参数)

选项:

-a:标示已修改的变量,以供输出至环境变量。
-b:使被中止的后台程序立刻回报执行状态。
-C:转向所产生的文件无法覆盖已存在的文件。
-d:Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e:若指令传回值不等于0,则立即退出shell。
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t:执行完随后的指令,即退出shell。
-u:当执行时使用到未定义过的变量,则显示错误信息。
-v:显示shell所读取的输入值。
-x:执行指令后,会先显示该指令及所下的参数。

参数;

取消某个set曾启动的参数。

实例:设置两个环境变量并设置为环境变量

[root@VM_0_12_centos ~]# unset var1  #删除shell变量
[root@VM_0_12_centos ~]# unset var2
[root@VM_0_12_centos ~]# unset var3
[root@VM_0_12_centos ~]# var1=value1  #定义shell变量的三种方式
[root@VM_0_12_centos ~]# declare var2=value2
[root@VM_0_12_centos ~]# typeset var3=value3
[root@VM_0_12_centos ~]# set -a var2  #将三个变量输出为环境变量
[root@VM_0_12_centos ~]# set -a var3
[root@VM_0_12_centos ~]# set -a var1
[root@VM_0_12_centos ~]# env | grep var  #查看环境变量
var1=value1
var3=value3
var2=value2

 3.env命令

  env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。该命令只使用"-"作为参数选项时,隐藏了选项"-i"的功能。若没有设置任何选项和参数时,则直接显示当前的环境变量。

  如果使用env命令在新环境中执行指令时,会因为没有定义环境变量"PATH"而提示错误信息"such file or directory"。此时,用户可以重新定义一个新的"PATH"或者使用绝对路径。

 语法:

env(选项)(参数)

选项;

-i:开始一个新的空的环境;
-u<变量名>:从当前环境中删除指定的变量。

参数:

  • 变量定义:定义在新的环境中变量,定义多个变量定义用空格隔开。格式为“变量名=值”;
  • 指定:指定要执行的指令和参数。

 例如:

查看环境变量

[root@VM_0_12_centos ~]# env | grep var
var1=value1
var3=value3
var2=value2
MAIL=/var/spool/mail/root

4.export命令

export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。

  一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。

 语法:

export(选项)(参数)

选项:

-f:代表[变量名称]中为函数名称;
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中;
-p:列出所有的shell赋予程序的环境变量。

参数:

  变量:指定要输出或者删除的环境变量。

例如:

[root@VM_0_12_centos ~]# export var1=value1  #定义一个环境变量
[root@VM_0_12_centos ~]# env|grep var  
var1=value1
MAIL=/var/spool/mail/root
[root@VM_0_12_centos ~]# export var1=value11111  #修改上面的环境变量
[root@VM_0_12_centos ~]# env|grep var
var1=value11111
MAIL=/var/spool/mail/root
[root@VM_0_12_centos ~]# export -n var1  #删除上面的环境变量,只是从环境变量中删除,shell变量仍然存在
[root@VM_0_12_centos ~]# env|grep var
MAIL=/var/spool/mail/root
[root@VM_0_12_centos ~]# 

6.readonly命令

  readonly命令用于定义只读shell变量和shell函数。readonly命令的选项-p可以输出显示系统中所有定义的只读变量。

语法:

readonly(选项)(参数)

选项:

-f:定义只读函数;
-a:定义只读数组变量;
-p:显示系统中全部只读变量列表。

参数:

变量定义:定义变量,格式为“变量名=‘变量值’”。

例如:查看系统的只读变量:

[root@VM_0_12_centos ~]# readonly -p
declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="11854"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"

总结:

  1.declare var=value   可以声明一个shell变量(与之等价的是 var=value,typeset var=value),也可以直接用declare -x var=value 声明一个变量并直接输出到环境变量,也可以加上-r参数表示只读变量。

  2.unset var 可以删除变量,包括shell变量和环境变量(当前用户变量),不能够删除具有只读属性的shell变量和环境变量。

  3.set -a var  可以将var变量输出到环境变量

  4.env可以查看所有的环境变量,可以加管道命令与grep命令过滤变量

     5.export var=value用于定义一个环境变量,修改环境变量也是这个,等价于 declare -x var=name

   export -n var 用于从环境变量删除此变量,但是shell变量中此变量仍然存在。

猜你喜欢

转载自www.cnblogs.com/qlqwjy/p/9075766.html