天天看点

shell变量

关于变量的内容

一、变量命名:

二、变量赋值:

三、变量类型:

四、变量取消:

五、取得变量值:

六、调整变量的属性

七、数组

八、变量扩展:

九、命令扩展:

一、变量名称:

    1、只能包含字母、数字和下划线,并且不能以数字开头,

    2、不应该跟系统中已有的环境变量重名

    3、最好能见名知意

设置变量:

变量名称=值

var_name=value 等号两边不能有空格

1

2

3

针对数字,你可以可以这样为变量赋值,定义一个变量的类型

三、bash:变量类型:

    环境变量:

    本地变量(局部变量):

    位置变量:

    特殊变量(系统变量):

本地变量:作用域为整个bash进程

    varname=value

局部变量:作用域只对当前代码段有效

    local varname=value

环境变量:作用域为当前shell进程及其子进程

    export varname=value "导出“

任意脚本在执行时会启动一个子shell进程,

        命令行中启动的脚本会继承当前shell的环境变量

        系统自动执行的脚本(跟命令行无关)就需要自我定义需要的各环境变量

位置变量:

    $1,$2,....

特殊变量:保持某些特殊数据

        $? 上一个命令执行状态返回值

        $# 参数的个数

        $* 参数列表

        $@ 参数列表

        $0  命令本身  脚本本身

    执行脚本时的脚本路径及名称

程序执行一般有两类返回值  

    程序执行结果;

    执行状态返回代码(0-255)

            0表示正确

            1-255:错误执行 1,2,127 系统预留 有特殊意义

四、撤销变量:

    unset varname

[root@lovelace 51cto]# unset youname;echo $youname

查看当前shell中的变量

        set  不带任何参数和选项

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

如果查看当前shell中的环境变量

        env

        export

        printenv

字符串变量添加新的变量

 PATH添加新的路径

export PATH=$PATH:/usr/local/apsch/bin

    $变量名称

    ${变量名称}  $(x) 这个可以用来当做命令调用

     如果变量在语句当中被引用,必须要使用${x}才可以,取得数组的变量值时候也需要使用${}来调用

关于变量和引号的关系:

    单引号:所见即所得

    双引号:使特殊符号生效

六、调整变量的属性:

1、readonly 命令 :定义只读变量

        -p:显示目前具有只读属性的变量列表

        -f:设定函数不可修改

        -a:定义数组不可修改

2、declare 命令 

        -r:设定只读变量

        -p:显示变量的属性

        -a:变量是一个数组

        -f:搜寻命令时,只找函数

        -i:变量是一个整数

        -F:显示所有的函数式名称及其属性

        -t:设立变量具有trace属性

        -x:设定环境变量

七、 数组:   

 是一种数据结构,有相关的数据项组成,每个数据项,称为数组的元素,且可采用索引的方式取得个元素的值

数组赋值:

1、单个赋值,以index作为索引号,索引号从0开始

    a[0]=1

    a[2]=2

    a[3]=3

2、使用小括号为数组赋值

    a=(1 2 3) 默认空格隔开

3、为数组中的某一个数据项赋值,默认是从0开始,如果中间出现未比标示的索引项,则从前一个索引项开始计算

    a={51 [3]=5  cto  [6]=8}

显示赋值:

    echo ${a[1]}

取出数组中所有的值:

    echo ${a[@]}  或者echo ${a[*]}

取得数组元素的个数:

    echo ${#a[@]} 或者 echo ${#a[*]}

八、高级变量:

${变量名称}  变量扩展

$(命令)      命令替换

$((算术式))  算术扩展

$(命令) 命令替换:

 测试变量存在与否:

    ${myname:-'nick'} 判断条件,如果myname存在,就返回值,如果myname不存在,就把-后接的字符串当做整个变量扩展的结果,并传回

测试变量不存在或为空,传回一个默认值

    ${myname:-'nick'} 如果待测变量不存在或为空,传回-后的值,存在则传回变量的值

测试变量不存在或为空,给变量设定一个默认值

    ${count:=100} 若变量coutn没有值或为空,则把待测变量设定为默认值,

测试变量不存在或为空,传回错误信息

    ${myname:?"your input error"}

测试变量的存在性:

    ${myname:+Ture} 若变量存在且值非空,则符合判断

    :  空              测空置

    -   负向            测不存在

    +   正向            测存在

    ?  有问题            检查是否完备后再来执行吧

    =   设值            给控值变量设定一个默认值

$(命令) 命令替换  此命令等同于·· (esc下的按键,不是单引号)这个在编写脚本的时候很有用

$((算术式))算术扩展:这个我们在下章将会单独讲解,这里给出示例查看

九、变量扩展“去字符串切片,字符串长度

 字符串切片是从0开始的 在使用${}的时候 大括号内的变量引用前面的$可以不写

        ${变量:位置起点}   ${myname:3}

        ${变量:位置起点:长度}

取部分参数:

        命令行参数是从$1开始的依次类推,$@代表所有参数,命令本身使用$0来表示

        ${@:起点}:由点开始,取得后面的所有的位置参数

        ${@:起点:个数}:由起点开始,取得指定个数的位置参数

示例脚本

执行结果:

计算字符串长度:

    ${#变量名称}:传回变量值的字符串长度

    expr:也可以统计字符串的长度

        1、str="here you are."

           len$(expr length "$str")

           echo "str 字符串长度是:$len"

        2、expr "字符串“:‘。*’

            str="here you are."

            len=$(expr "$str":'.*')

            echo "str字符串长度是:$len"

变量扩展:对比样式

    由字符串前面对比,删除最短的

         ${变量#样式}

    由字符串前面对比,删除最长的

         ${变量##样式}

    由字符串后面对比,删除最短的

         ${变量%样式}

    由字符串后面对比,删除最长的

          ${变量%%样式}

至于对比样式可以根据自己的思考来获得,这个没有固定的格式

取代或删除部分字符串:

    只替换第一个对比符合的字符串

        ${变量/样式/替换字符串}

    替换所有符合的字符串

        ${变量//样式/替换字符串}

删除对比符合的字符串

    只删一个

        ${变量/样式/}

    删除全部

        ${变量//样式/}

    #T  行首位置

    %LE  最后面

变量扩展:取变量名称列表、数组索引列表

取变量名称列表:

        ${!开头字符串@}或${!开头字符串*}

取数组索引列表:

        ${!数组变量[@]}或${!数组变量[*]}

后记:学习shell编程,变量这一块很重要,文章中列出的仅仅是变量内容的一部分,还有很多像系统内置变量,以及环境变量,局部变量之间的转化,我们这里没有提及到,所以需要我们多练习、多总结。就算你一下记不住这么多知识,熟能生巧总是可以的吧......

本文出自 “追马” 博客,请务必保留此出处http://lovelace.blog.51cto.com/1028430/1211141