在前两次的博文中,我们简单的介绍了一些关于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。
其他的内容,可以看表实验吧,这里就不一一演示了。
待续.................