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  位置参数