linux定义只读变量命令-----readonly

扶醉桌前 提交于 2020-02-20 16:28:51

readonly

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

格式

readonly 【选项】【参数】

选项

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

理解案例

这个命令是到底有什么作用?用一个简单的案例,帮助理解。

首先我们登陆的用户是root

[root@linus ~]# who
root     pts/0        2020-02-20 20:54 (192.168.1.11)

root用户所对应的UID是0

[root@linus ~]# echo $UID
0

UID也是一个变量,我们尝试一下对其进行更改

[root@linus ~]# UID=11
-bash: UID: 只读变量

连上帝用户root都无法直接更改,这就是所谓的只读变量。为什么把UID定义成只读变量呢,仔细想一想,如果一个普通用户可以修改自己的UID,那么改成0的话,那岂不是可以拥有root用户权限,这么大的安全风险,当然要避免,所以把UID设置成只读变量。

readonly命令就是用来定义只读变量的。

常用实例

显示全部只读变量
注:是不是对显示的declare前缀很好奇,其实declare也是设置只读变量的命令,详细请阅读linux声明shell变量命令-----declare

[root@linus ~]# 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="1690"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"

直接使用readonly,后面跟上定义的变量即可

[root@linus ~]# readonly  h=hahaha
[root@linus ~]# echo $h
hahaha
[root@linus ~]# h=hhh
-bash: h: 只读变量
[root@linus ~]# readonly -p | grep h=
declare -r h="hahaha"

那疑问就来了,如果定义完之后,是不是一直都存在,也无法更改。
其实他和我们定义一个普通变量一样,都是写在内存中的,重新打开一个shell或者重新打开终端后就消失了。

[root@linus ~]# bash
[root@linus ~]# readonly -p | grep h=

想让其永久生效,,可以将其设置成全局变量或者修改/etc/profile即可
例:

[root@linus ~]# export readonly h=hahaha
[root@linus ~]# echo $h
hahaha
[root@linus ~]# bash
[root@linus ~]# echo $h
hahaha
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!