1. 介绍
任一shell 都独立保存一份变量列表 ,包括从父shell导出的环境变量和局部变量,可以根据变量的作用范围将其简单地分为环境变量和局部变量
环境变量: 可以在定义它的shell中使用,子shell(子进程)也可继承使用,可以简单的理解为shell 需要向子shell传递内容时使用。但只遵行父>子的传递方向,其它方向不成立,如子shell对环境变量的修改不会反应在父shell中。
局部变量:只存在于定义它的shell
经常谈到的概念,全局变量,内部变量,系统变量,用户变量,位置参数,本地变量(同局部变量)等,也可归于环境变量和局部变量, 以避免混淆,它们只不量过从另外的角将变量归类。
全局变量:就是环境变量,相对于局部变量而言的环境变量的另一种叫法。
内部变量:通常指系统定义的一类特殊的环境变量(通常是只读类型),通常用户知道其作用,引用即可,如写脚本常用的位置参数。
位置参数:特殊的只读环境变量,通常在脚本 中引用,没有赋值和修改操作,用于向shell脚本传递参数
系统变量:指系统预定义的一类环境变量,主要用于设定用户shell环境,一般用户也只知道什么时候引用即可。用户可以自行修改,但一般在脚本中修改这些变量也没有什么意义。可以使用set查看。
用户变量:用行任意定义的变量,可以是环境变量,也可以是局部变量
2. 变量的基本属性和操作
变量的基本属性和操作不区分是环境变量还是局部变量,环境变量和局部变量只是有定义和作用范围的差异而已
变量数据类型
shell变量是无类型,严格来说数据类型只有字符型,所以shell不要求定义变量时声明其类型,定义取用比较随意。至于数值运算,shell会根据上下文将文本看成数值型,并进行算术和比较等数值操作(若变量中包含数字,则认定其为数值型变量.)
变量名称
由 _,A-Z,a-z,0-9字符组成,不能以数字开头,默认约定环境变量全部大写,局部变量小写。用记可自行定义命名规则,但最好不要引起不必要的混淆。
变量赋值
变量可以设置为任何值,当设置的值包含空格时,需将值使使用引号括起来。
variable=value(两边无空格,若value包含空格,习惯使用"" 或' ')
${variable=value}
赋值的特殊模式:
variable+value,对已赋值的variable,重设其值,未赋值则仍为空
variable:?value ,对未赋值的variable ,显示系统错误信息,否则显示variable的值(用于测试变量是否已赋值)
variable:=value 对未赋值的variable ,将value值赋给它
variable:-value ,赋值,但不存储在对地址空间
e.g.
variable2="hello world" 定义变量且赋值,或重设其值
variable4="we are saying $variable2" 变量赋值
variable=value;echo $variable 输出value
echo ${variable=value} , 若variable 未定义,则赋值,表达式值为value. 若variable已定义,则varible 保持原值,且表达式值与其相同
echo ${variable+value} ,variable 已赋值,则variable和表达式的值均为value.若variable未赋值,表达式为空,且不会定义variable
echo ${variable:?value} variable 未赋值,显示系统错误;variable已赋值,表达式值为$variable (用于测试变量是否被赋值)
echo ${variable:=value},variable未赋值,将value值赋给它,表达式值为value;varialbe 已赋值,保持原值,表达式的值为$variable
echo ${variable:-value},variable值保持不变,variable已赋值时,表达式值为$varialbe. variable未赋值时,表达式值为value
PATH="$PATH":/home/bin"$变量名称" ${变量} 扩增变量内容
变量引用
即提取变量值时使用,引用变量也称为变量替换(使用符号$), $variable即表示变量值。
${variable},可避免变量名引用时的歧义,比如变量名包含空格或者变量名后有其它字符时的引用
e.g.
echo $LOGNAME
取消变量:unset variable释放变量的内存空间
清空变量: variable= 只是清空变量值,值为null,
只读变量
readonly variable=value
readonly variable 设置为只读变量,一旦设置为只读变量后,任何用户无法再对其赋值。可以定义时赋值,并设定只读属性。也可以修改成只读属性。
declare , typeset也可以定义只读变量
变量操作总结
echo $变量名 引用变量值
echo ${变量名}
echo $var_1$var_2 结合变量值
unset VAR 取消变量
unset -v
unset -f
VAR= 清空变量
env export 列出环境变量
export -p
declare -x
set 列出所有变量
VAR=apple 变量建立与赋值语法
declare 声明变量
readonly varname 定义只读变量
read -p -t variable 读取变量
3. 环境变量
每个进程有一个由子进程继承的环境变量集合,给系统或用户应用程序设置的一些变量,通常用大写表示。set 列出shell 变量,env 列出环境变量
一般的执行script 前,系统环境已经处在login shell中, 执行script 时创建子shell 时会继承父shell(login shell) 的环境变量,环境变量适用于所有登录进程产生的子进程。
4. 位置参数
位置参数是一种特殊的只读变量,用于从命令行向shell脚本传递参数,可以在脚本中用shift进行左移操作以处理参数。
$0 表示脚本名(程序名,第一个参数前的内容)
$1,$2,.....$9,${10},${11},....${100}表示第1,2....9,10,11,......100个参数
其它特殊变量
用来获取脚本相关信,只要知道如何引用(前加$即可)和在哪引用。
Linux中执行的命令通常都有参数检查机制,即参数非法,将打印用法消息,并且返回一个非零返回码,以标识是何种错误。
命令结束状态, 内置变量? ($?) 存储命令执行后的返回值,0 为成功 , 大于0的数值则代表各种失败的代码 , 经常作业用于条件测试
变量名 说明
* 以一个单字符串显示所有向脚本传递的参数
@ 传递到脚本的所有参数
# 脚本参数个数
$ 当前运行脚本进程的PID,
? 上条指令的退出状态:0 为成功, (返回值) exitstatus,其它值表示各种错误
- 调用中向shell给出的选项
_ 前面指令的最后一个参数
! 最后一个后台进程的PID
0 shell名称
1~n 位置参数