Shell变量
变量介绍
在编程中,我们总有一些数据需要临时存放在内存,以待后续使用时快速读出。内存在系统启动的时候被按照1B一个单位划分若干个块,然后统一编号(16 进制编号),并对内存的使用情况做记录,保存在内存跟踪表中。
那么问题来了,1G 内存有多少个 1B 单位呢?
计算机的存储容量单位: 1B = 8bit 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB 1PB = 1024TB 1EB = 1024PB 1ZB = 1024EB . . .
好了,已经够大了!当然还有 YB、BB 更大的单位,同样进制也是 1024。
1G = 1024*1024*1024 = 10737418248B
假如你将一个 1B 的字符存入内存,如何读出呢?有么有一种大海捞针的感觉阿!我们讨论一下计算机是如何让我们人类快速将数据存在内存,如何从内存中读出数据的。我们研究过变量后就明白了。
**变量:是编程中最常用的一种临时在内存中存取数据的一种方式。**
变量存储原理图
从图片可以看出,当我们在脚本中定义变量存值的时候,可以从以下方面看到变化:
内存占用:
如果存的是一个字符则占用 1 个字节,如果存的是字符串则是字符串长度再加上 1 个字节长度(\0 是一个特殊字符,代表字符串的结束)。
变量名也内存的空间关系:
计算机中会将对应的内存空间和变量名称绑定在一起,此时代表这段内存空间已经被程序占用,其他程序不可复用;然后将变量名对应的值存在对应内存地址的空间里。
理解变量的存储与读取(STRING1="ABC")
变量存储原理
- STRING1(逻辑地址)<===> 0x5...0x8(物理地址) 存取数据 ABC STRING1 是逻辑地址,给人看的,方便热记忆; 0x5...0x8 是内存物理地址,是计算机寻址的依据;
- 对于人来说 STRING1 上存的数据是 ABC,对于计算机来说数据是存在物理地址上的;
- 在建立变量的时候,计算机自动将逻辑地址(变量名)和物理地址做了对应绑定。
变量读取原理
当调用STRING1的时候,计算机会根据对应关系,找到物理地址; 定位内存地址,读出数据并返回。
变量分类
- 本地变量:用户私有变量,只有本地用户可以使用,保存在家目录下的
.bash_profile
、.bashrc
文件中 - 全局变量:所有用户都可以使用,保存在
/etc/profile
、/etc/bashrc
文件中 - 用户自定义变量:用户自定义,比如脚本中的变量
补充说明:
- 计算机启动系统后,全局变量会先加载到内存中;
- 当用户登录系统成功之后,本地变量会加载到内存中;
- 打开一个终端或一个脚本,自定义临时变量会在关闭终端或脚本运行结束后,变量会自动从内存中释放。
定义变量
定义变量
定义变量格式:变量名=值
在shell编程中的变量和等号之间不能有空格。
变量名命名规则:
- 命名只能使用英文字母、数字和下划线,首歌字符不能以数字开头;
- 中间不能有空格,可以使用下划线(_);
- 不能使用标点符号;
- 不能使用 bash 里的关键字(可以使用
help
命令查看保留关键字)。
定义变量演示:
#变量赋值,此种方法设置为本地变量
[root@linuc ~ ]# name="admin"
[root@linuc ~ ]# var1="hello world!"
[root@linuc ~ ]# age=30
[root@linuc ~ ]# score=88
注意:字符串要用单引号或双引号引起来。
读取变量内容
读取变量内容符:$
读取方法:$变量名
#变量内容读取
[root@localhost ~ ]# echo $name
admin
[root@localhost ~ ]# echo $school
jialidun
[root@localhost ~ ]# echo $age
30
[root@localhost ~ ]# echo $score
88
取消变量
取消变量命令:unset
[root@localhost ~ ]# unset name
[root@localhost ~ ]# echo $name
[root@localhost ~ ]#
说明:对于本地变量和全剧变量,unset
只能临时取消,当用户重新登录或重启计算机后,变量就会恢复。
定义永久变量
- 本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的
.bash_profile
、.bashrc
文件中 - 全局变量:所有用户否可以使用,保存在
/etc/profile
、/etc/bashrc
文件中
本地变量
[root@localhost ~ ]# tail -l ~/.bahs_profile
name='admin'
全局变量
[root@linuc ~ ]# tail -l /etc/profile
exprot age=30
说明
只需要在对应的文件中定义所需要的变量即可,但定义全局变量时,需要在前面加上 export 才可以。