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变量中此变量仍然存在。

相关推荐
-
「PHP」MVC框架是什么?为什么要用它2025-02-25 00:25:41
-
如何用PHP写一个比较安全的API系统(实现)2025-02-25 00:19:49
-
php 解析url获取相关信息2025-02-25 00:15:37
-
mysql命令总结和PyMysql2025-02-25 00:11:35
-
MySQL特性:深入理解ICP2025-02-25 00:11:07