• linux_shell_3_shell变量特性


      在前两次的博文中,我们简单的介绍了一些关于shell和shell变量的特性,这里我们继续我们的linux shell之旅。

    1、变量时间和空间作用域

      我们知道在C语言中变量存在时间和空间作用域的问题,在linux shell中,顺延了这两个概念。通常变量是具有当前会话的空间和时间作用域的。

    我就简单的说几点我自己的认识,说的不一定完全正确,欢迎大家提出不同意见帮助我提高(虽然挂了个volcanol的用户名,还是感觉linux这潭水太

    深了)。

          a: 一般的shell变量具有当前shell会话的时间和空间作用域。

      b: 通过export的变量具有当前用户login会话的时间和空间作用域。

      c: 通过修改/etc/bashrc、/home/username/.bashrc 、 /home/username/.bash_profile文件然后用export变成环境变量具有永久的时间和空间作用域,这里注意区分

    修改的是系统配置文件还是个人用户的配置文件,系统的和个人用户的时间和空间作用域不完全一致。 

    2、读取用户的输入信息

      有时在执行shell脚本的时候,需要根据用户的输入信息决定下一步的执行情况,这就需要shell支持读取用户输入的特性; 在bash中,通过read函数或者说

    read命令读取用户输入。

    [volcanol@volcanol ~]$ read test
    this is a test
    [volcanol@volcanol ~]$ echo $test
    this is a test

      我们可以发现成功的读入了用户的交互信息。read命令常用的格式如下:

        read   -p   prompt信息  -t   等待时间(s)   变量名

    Exp:

    [volcanol@volcanol ~]$ read -p  "Please input you name:" -t 10 name
    Please input you name:[volcanol@volcanol ~]$ read -p  "Please input you name:" -t 10 name
    Please input you name:volcanol
    [volcanol@volcanol ~]$ echo $name
    volcanol

      第一行命令执行的时候,输出第二行的前半部分"Please input you name: " 但是由于我没有输入信息,因此等待10s后就进入到shell提示符状态;然后我继续

    执行第一行的命令,然后输入名字为:volcanol;

      第四行,可以看到,成功的从shell console中读入了我的输入信息:volcanol。

    3、带类型的变量

      我们知道,在C语言中变量是具有类型的,在shell中变量也可以有类型。在shell中通过declare/typeset命令定义变量的类型。

    其语法格式为:

         declare  -aixr  变量名。

      a: 将一个变量定义为数组

          i:将一个变量定义为整数

          x:相当于export的作用

          r: readonly

    Exp:

    [volcanol@volcanol ~]$ declare -i sum=10+20+30
    [volcanol@volcanol ~]$ echo $sum
    60
    [volcanol@volcanol ~]$ sum=1+2+3
    [volcanol@volcanol ~]$ echo $sum
    6
    [volcanol@volcanol ~]$ unset sum
    [volcanol@volcanol ~]$ sum=1+2+3
    [volcanol@volcanol ~]$ echo $sum
    1+2+3

      通过上面的实例我们可以清楚的看到-i参数的作用,和declare命令的作用

    4、数组的声明

      前面说过shell支持数据类型,同样shell还支持数据结构,典型的就是数组array。bash中通过下面的方式定义数组:

        var[index]=content

    Exp:

     test[1]="test1"
    [volcanol@volcanol ~]$ test[1]="test2"
    [volcanol@volcanol ~]$ test[1]="test"
    [volcanol@volcanol ~]$ test[1]="test1"
    [volcanol@volcanol ~]$ test[2]="test2"
    [volcanol@volcanol ~]$ test[3]="test3"
    [volcanol@volcanol ~]$ echo $test[1]  $test[2] $test[3]
    [1] [2] [3]
    [volcanol@volcanol ~]$ echo "$test[1]  $test[2] $test[3]"
    [1]  [2] [3]
    [volcanol@volcanol ~]$ echo "${test[1]},  ${test[2]}. ${test[3]}"
    test1,  test2. test3
    [volcanol@volcanol ~]$ echo "${test[1]},  ${test[2]} . ${test[3]}"
    test1,  test2 . test3
    [volcanol@volcanol ~]$ echo "${test[1]},  ${test[2]} .${test[3]}"
    test1,  test2 .test3
    [volcanol@volcanol ~]$
    [volcanol@volcanol ~]$ echo "${test[1]},  ${test[2]} , ${test[3]}"
    test1,  test2 , test3

      可以发现数组的引用与一般变量的区别,使用是注意分辨,否则容易出错。

    5、扩展变量功能

      在shell中还对变量的使用进行扩展,比方说提取变量内容,截取变量内容,通过查看变量是否设置然后结合表达式求变量的值等等。

    5、1 利用#符号截取变量的内容

    Exp: 截取变量内容

    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name##/*/}
    .bashrc
    [volcanol@volcanol ~]$ echo ${name##/}
    home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name#/*/}
    volcanol/.bashrc
    [volcanol@volcanol ~]$ name=root/home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name##/*/}
    root/home/volcanol/.bashrc

      如一个变量的开始是 / 并且变量的内容中存在两个/(或以上个数的/) ,那么通过##/*/可以删除两个/之间的所有内容,

    Tip:这样并不影响原来变量的内容。

    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name##/*/}
    .bashrc
    [volcanol@volcanol ~]$ echo ${name}
    /home/volcanol/.bashrc
    [volcanol@volcanol ~]$

      而如果是用一个#号则有不同的意义,见实例。

    Exp:

    [volcanol@volcanol ~]$ unset name
    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name#/*/}
    volcanol/.bashrc
    [volcanol@volcanol ~]$ name=/home/volcanol
    [volcanol@volcanol ~]$ echo ${name#/*/}
    volcanol
    [volcanol@volcanol ~]$

      用一个#符号表示删除第一对/  /之间的内容。

    5、2  利用%截取变量的内容

    Exp:

    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc
    [volcanol@volcanol ~]$ echo ${name%%/*/}
    /home/volcanol/.bashrc
    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc/
    [volcanol@volcanol ~]$ echo ${name%%/*/}
    
    [volcanol@volcanol ~]$

      可以发现%是从后往前计算的,这与#刚好相反。

    Exp:

    [volcanol@volcanol ~]$ name=/home/volcanol/.bashrc/
    [volcanol@volcanol ~]$ echo ${name%/*/}
    /home/volcanol
    [volcanol@volcanol ~]$

    5、3 相似之处

      #是从前往后计算,而%是从后往前计算

          ##、%%均是取最长的匹配

      #、%均是取短的匹配。

    6、${var opr Expr}  Tip: var 和opr 和Expr之间无空格在使用的时候。

         本图是鸟哥的资源,这里表示一下感谢,感觉这么多的书还是鸟哥的linux教程分析的比较好(嘻嘻........买了一本鸟哥的书花了65大洋

    ,唯一遗憾的是没有光盘)。

    Exp:

    [volcanol@volcanol ~]$ unset var
    [volcanol@volcanol ~]$ echo ${var-"volcanol"}
    volcanol

      这里表示如果没有设置 var,且设置了Expr的内容,那么${var-expr}就返回expr的内容。

    Exp:

    [volcanol@volcanol ~]$ var=""
    [volcanol@volcanol ~]$ echo ${var-"volcanol"}

      如果var为空,则${var-expr}返回var的内容;因此总结就是,对于${var-expr},如果var没有设置,则返回expr的值,否则返回var的值。

    Exp:

    [volcanol@volcanol ~]$ unset var
    [volcanol@volcanol ~]$ var="volcanol"
    [volcanol@volcanol ~]$ echo ${var:-"set"}
    volcanol
    [volcanol@volcanol ~]$ unset var
    [volcanol@volcanol ~]$ echo ${var:-"set"}
    set
    [volcanol@volcanol ~]$ var=""
    [volcanol@volcanol ~]$ echo ${var:-"set"}
    set
    [volcanol@volcanol ~]$

      这里可以看出,通过增加”:“ 该变量var为空时的输出。这里可以这样总结,如果如果设置了非空var,那么 ${var:-expr} 就返回var的值;否则就返回expr。

    其他的内容,可以看表实验吧,这里就不一一演示了。

    待续.................

  • 相关阅读:
    static和final
    java面向对象白话解说
    方法
    数组
    JDK的安装和java程序的开发步骤以及环境变量配置
    VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案
    js简易写法
    .NET程序性能优化基本要领
    数据采集类
    ASP.NET MVC 3 配置EF自动生成模型
  • 原文地址:https://www.cnblogs.com/volcanol/p/2537330.html
Copyright © 2020-2023  润新知