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。

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

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

原文地址:https://www.cnblogs.com/volcanol/p/2537330.html