shell 之变量详解,让你秒懂!
一、变量介绍
在编程中,我们总有一些数据需要临时存放在内存,以待后续使用时快速读出
先了解一下计算机的存储单位
假如你将一个 1B 的字符存入内存,如何读出呢?有没有一种大海捞针的感觉啊!
我们讨论一下计算机是如何通过让我们人类快速将数据存在内存,如何从内存中读出数据的。我们研究过变量后就明白了变量:变量是编程中最常用的一种临时在内存中存取数据的一种方式
变量存取原理
CHAR1(0x3)=A 从图片可以看出,当我们在脚本中定义变量存值的时候,可以从以下方面看到变化:
a、内存占用:如果存的是一个字符则占用 1 个字节,如果存的是字符串则是字符串的长度加 1 个字节长度(\0 是一个特殊字符,代表字符串结束)。
b、变量名与内存空间关系:计算机中会将对应的内存空间地址和变量名称绑定在一起,此时代表这段内存空间已经被程序占用,其他程序不可复用;然后将变量名对应的值存在对应内存地址的空间里。
二、变量定义
2.1、什么时候需要定义变量?
如果某个内容需要多次使用,并且在代码中重复出现,那么可以用变量代表该内容。
这样在修改内容的时候,仅仅需要修改变量的值。
在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。
2.2、定义一个变量
变量格式: 变量名=值
在 shell 编程中的变量名和等号之间不能有空格。
定义变量举例:
VAR1=1
age=18 整形
name=‘baism’ 字符串
score=88.8 浮点
注意:字符串要用单引号或双引号引起来
建议变量名为大写,和命令区分
定义变量演示:
2.3、取消变量 unset
2.4、 有类型变量 declare
-i 将变量看成整数-r 使变量只读 readonly,该变量的值无法改变,并且不能为 unset-x 标记变量通过环境导出 export-a 指定为索引数组(普通数组);查看普通数组-A 指定为关联数组;查看关联数组
三、变量分类
系统中的变量根据作用域及生命周期可以分为四类:
本地变量、环境变量、全局变量、内置变量
3.1、本地变量
用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失效
3.2、环境变量
定义在用户家目录下的.bashrc
或.bash_profile
文件中,用户私有变量,只能本用户使用。
查看当前用户的环境变量 env
查询当前用户的所有变量(临时变量与环境变量) set
3.3、将当前变量变成环境变量 export
关于 export 说明
用户登录时:
用户登录到 Linux 系统后,系统将启动一个用户 shell。在这个 shell 中,可以使用 shell 命令或声明变量,也可以创建并运行 shell 脚本程序。
运行脚本时:
运行 shell 脚本程序时,系统将创建一个子 shell。此时,系统中将有两个 shell,一个是登录时系统启动的 shell,
另一个是系统为运行脚本程序创建的 shell。当一个脚本程序运行完毕,它的脚本 shell 将终止,可以返回到执行该脚本之前的 shell
从这种意义上来说,用户可以有许多 shell,每个 shell 都是由某个 shell(称为父 shell)派生的。
在子 shell 中定义的变量只在该子 shell 内有效。如果在一个 shell 脚本程序中定义了一个变量,当该脚本程序运行时,
这个定义的变量只是该脚本程序内的一个局部变量,其他的 shell 不能引用它,要使某个变量的值可以在其他 shell 中被改变,可以使用 export 命令对已定义的变量进行输出。
export 命令将使系统在创建每一个新的 shell 时定义这个变量的一个拷贝。这个过程称之为变量输出。
3.4、全局变量
使用export
命令将本地变量输出为当前 shell 中的环境变量
所有用户及 shell 都可以使用,可以在/etc/profile /etc/bashrc
下永久定义
3.5、内置变量
系统变量(内置 bash 中变量) : shell 本身已经固定好了它的名字和作用
$?
:上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错
若退出状态值为 0,表示命令运行成功
若退出状态值为 127,表示 command not found
若退出状态值为 126,表示找到了该命令但无法执行(权限不够)
若退出状态值为 1&2,表示没有那个文件或目录
$$
:当前所在进程的进程号
$!
:后台运行的最后一个进程号 (当前终端) # gedit &
!$
:调用最后一条命令历史中的参数
!!
:调用最后一条命令历史
$#
:脚本后面接的参数的个数
$*
:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@
:脚本后面所有参数,参数是独立的,也是全部输出
$0
:当前执行的进程/程序名 echo $0
9 位置参数变量{n} 扩展位置参数变量 第 10 个位置变量必须用{}大括号括起来./1.sh a b c
了解$*
和$@
的区别:
$*
:表示将变量看成一个整体$@
:表示变量是独立的
变量总结说明:
本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
环境变量:当前进程有效,并且能够被子进程调用。
全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
内置变量:shell 本身已经固定好了它的名字和作用.
四、变量取值
读取变量内容符: 读取方法:变量名
注意
变量读取过程中,默认单引号是不解释变量的。比如:
如果必须使用单引号还要读取变量的值可以使用 eval 命令[重新运算求出参数的内容]
五、其他变量(扩展)
取出一个目录下的目录和文件:dirname 和 basename
变量"内容"的删除和替换一个
%
代表从右往左去掉一个/key/
两个%%
代表从右往左最大去掉/key/
一个#
代表从左往右去掉一个/key/
两个##
代表从左往右最大去掉/key/
版权声明: 本文为 InfoQ 作者【飞向星的客机】的原创文章。
原文链接:【http://xie.infoq.cn/article/87fe7cae300796a444b7baffa】。文章转载请联系作者。
评论