Shell是一种弱类型的语言,变量存储的一切值都是字符串。Shell变量的本质上是一个键值对,即使用一个关键字来记录或引用一个值。和其它强类型的编程语言不同,Shell变量不需要预先定义,或者说赋值即定义,而且可以引用未赋值的变量。在引用一个事先未赋值过值的变量时,该变量为一个空的字符串。
例如:
biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
biantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"
biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
LazyBone1994
biantiao@lazybone1994-ThinkPad-E430:~$
在上面的例子中,myName一开始并没有赋值,但仍然可以对它进行引用,只不过显示的是一个空的字符串。与下面赋值过后的输出形成对比。
注意:当在变量名后面紧跟一个由非空白字符开始的字符串时,为了使变量名和其后的字符串区分开来,应该使用花括号“{}”将变量括起来。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"
biantiao@lazybone1994-ThinkPad-E430:~$ cat ${postion}termio.h
/* Compatible for old `struct termio' ioctl interface.
This is obsolete; use the POSIX.1 `struct termios' interface
defined in instead. */
#include
#include
但如果没有使用花括号将产生以下的错误情况,如结果所示如果你不使用花括号而人为地加上空格也将出错:
biantiao@lazybone1994-ThinkPad-E430:~$ position="/usr/include/"
biantiao@lazybone1994-ThinkPad-E430:~$ cat $positiontermio.h
cat: .h: 没有那个文件或目录
biantiao@lazybone1994-ThinkPad-E430:~$ cat $position termio.h
cat: /usr/include/: 是一个目录
cat: termio.h: 没有那个文件或目录
biantiao@lazybone1994-ThinkPad-E430:~$
biantiao@lazybone1994-ThinkPad-E430:~$ myName="LazyBone1994"
biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
LazyBone1994
biantiao@lazybone1994-ThinkPad-E430:~$ unset myName
biantiao@lazybone1994-ThinkPad-E430:~$ echo $myName
biantiao@lazybone1994-ThinkPad-E430:~$
可以看到在对变量使用了unset命令后变量值变成了空字符串。
* 使用特殊变量引用 “${#变量名}” 可以得到变量的长度,即字符数。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ str="Hello World!"
biantiao@lazybone1994-ThinkPad-E430:~$ echo Length of \"$str\" is ${#str}
Length of "Hello World!" is 12
biantiao@lazybone1994-ThinkPad-E430:~$
命令替换是一个将一个或多个命令的执行结果赋给变量的一种方法。实现的方法有两种。一种是使用反引号“ `…` ”。另一种是“ $(…) ”。多个命令之间用分号;来分割。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ str=`pwd; who`
biantiao@lazybone1994-ThinkPad-E430:~$ echo $str
/home/biantiao biantiao :0 2015-07-14 15:55 (:0) biantiao pts/3 2015-07- 14 17:08 (:0)
biantiao@lazybone1994-ThinkPad-E430:~$
使用declare和typeset来限定变量的属性。常用的变量属性有如下:
* -r 只读
* -i 整数
* -a 数组
* -f 函数
* -x 导出变量
例如:将变量声明为整数,使其可以进行整数的运算。
如果没有将其声明为整数类型,它会是这个样子:
biantiao@lazybone1994-ThinkPad-E430:~$ a=10
biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
a+10
biantiao@lazybone1994-ThinkPad-E430:~$
将其声明为整数类型时:
biantiao@lazybone1994-ThinkPad-E430:~$ declare -i a=10
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
10
biantiao@lazybone1994-ThinkPad-E430:~$ a=a+10
biantiao@lazybone1994-ThinkPad-E430:~$ echo $a
20
biantiao@lazybone1994-ThinkPad-E430:~$
个人思考:shell是一种弱类型的编程语言。如果没有声明变量类型的这种机制,那么使用shell将很难进行数值计算。使用-i是声明整型变量,那么问题来了,shell能否进行浮点运算?如果能,那怎样使用浮点运算?
在shell中,数组变量的声明和使用的语法非常简单,和C语言当中的语法类似。要注意的就是,在bash shell 中数组变量支持组合赋值,什么是组合赋值,就是将多个值组合在一起同时赋值给数组中。比如下面的例子。
biantiao@lazybone1994-ThinkPad-E430:~$ student=(张三 李四 王五 LazyBone1994)
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[0]}
张三
biantiao@lazybone1994-ThinkPad-E430:~$ echo $student
张三
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}
LazyBone1994
biantiao@lazybone1994-ThinkPad-E430:~$ student[3]=赵六
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${student[3]}
赵六
biantiao@lazybone1994-ThinkPad-E430:~$
从上面的例子可以看到,引用没有带下标的数组名student相当于引用下标为0的数组元素student[0]。数组变量的赋值就是将值放在括号里,每个值用空格隔开即可。
有关数组的几个特殊变量引用
- 使用“ 数组名[∗]”和“ {数组名[@]}”来引用数组中所有非空元素。比如:
biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[3]=THU
biantiao@lazybone1994-ThinkPad-E430:~$ week[5]=SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[*]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${week[@]}
MON TUE WED THU SAT
biantiao@lazybone1994-ThinkPad-E430:~$
biantiao@lazybone1994-ThinkPad-E430:~$ week=(MON TUE WED)
biantiao@lazybone1994-ThinkPad-E430:~$ week[6]=SUN
biantiao@lazybone1994-ThinkPad-E430:~$ echo ${#week[@]}
4
biantiao@lazybone1994-ThinkPad-E430:~$