Linux Shell编程学习笔记(2)

Linux Shell编程学习笔记(2015-7-12)

分类:linux shell

Shell变量

一:关于Shell变量

  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:~$ 

二:Shell变量的两个使用技巧

  • 使用unset命令将一个变量的值清除,例如:
    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:~$ 

你可能感兴趣的:(Linux,Shell)