7.  Shell中的内置变量:
    Shell
中提供了一些以$开头的内置变量,见下表:

变量名

描述

$?

表示Shell命令的返回值

$$

表示当前Shellpid

$-

表示当前Shell的命令行选项

$!

最后一个放入后台作业的PID

$0

表示脚本的名字

$1--$9

表示脚本的第一到九个参数

${10}

表示脚本的第十个参数

$#

表示参数的个数

$*,$@

表示所有的参数,有双引号时除外,"$*"表示赋值到一个变量,"$@"表示赋值到多个。

    所有的内置变量都比较容易理解,因此这里仅给出$*$@的区别用法:
    /> set 'apple pie' pears peaches
    /> for i in $*
    >  do
    >  echo $i
    >  done
    apple
    pie
    pears
    peaches

    /> set 'apple pie' pears peaches
    /> for i in $@
    >  do
    >  echo $i
    >  done
    apple
    pie
    pears
    peaches


    /> set 'apple pie' pears peaches
    /> for i in "$*"           #将所有参数变量视为一个
    >  do
    >  echo $i
    >  done
    apple pie pears    peaches
    
    /> set 'apple pie' pears peaches
    /> for i in "$@"
    >  do
    >  echo $i
    >  done
    apple pie                   #
这里的单引号将两个单词合成一个.
    pears
    peaches    
    
  
  8.  引用:
    Shell
中提供三种引用字符,分别是:反斜杠、单引号和双引号,它们可以使Shell中所有元字符失去其特殊功能,而还原其本意。见以下元字符列表:

元字符

描述

;

命令分隔符

&

后台处理Shell命令

()

命令组,创建一个子Shell

{}

命令组,但是不创建子Shell

|

管道

< >

输入输出重定向

$

变量前缀

*[]?

用于文件名扩展的Shell通配符

    注:单引号和双引号唯一的区别就是,双引号内可以包含变量和命令替换,而单引号则不会解释这些,见如下示例:
    /> name=Stephen
    /> echo "Hi $name, I'm glad to meet you! "  #name变量被替换
    Hi Stephen, I'm glad to meet you!
    /> echo 'Hi $name, I am glad to meet you! ' #name变量没有被替换
    Hi $name, I am glad to meet you!
    /> echo "Hey $name, the time is $(date)"      #name变量和date命令均被替换
    Hey Stephen, the time is Fri Nov 18 16:27:31 CST 2011
    /> echo 'Hey $name, the time is $(date)'
    Hey $name, the time is $(date)                      #name
变量和date命令均未被替换

    9.  命令替换:
    
同样我们需要把命令的输出结果赋值给一个变量或者需要用字符串替换变量的输出结果时,我们可以使用变量替换。在Shell中,通常使用反引号的方法进行命令替换。
    /> d=`date`                           #date命令的执行结果赋值给d变量。
    /> echo $d
    Fri Nov 18 16:35:28 CST 2011
    /> pwd
    /home/stephen
    /> echo `basename \`pwd\``  #基于反引号的命令替换是可嵌入的,但是嵌入命令的反引号需要使用反斜杠转义。
    stephen
    除了反引号可以用于命令替换,这里我们也可以使用$(command)形式用于命令替换。
    /> d=$(date)
    /> echo $d
    Fri Nov 18 16:42:33 CST 2011
    /> dirname="$(basename $(pwd))"     #和之前的反引号一样,该方式也支持嵌套。
    /> echo $dirname
    stephen

   10.  数学扩展:
    Shell
中提供了两种计算数学表达式的格式:$[ expression ]$(( expression ))
    /> echo $[5+4-2]
    7
    /> echo $[5+2*3]
    11
    /> echo $((5+4-2))
    7
    /> echo $((5+2*3))
    11    
    事实上,我们也可以在Shell中声明数值型的变量,这需要在declare命令的后面添加-i选项,如:
    /> declare -i num
    /> num=5+5      #注意在赋值的过程中,所有的符号之间均没有空格,如果需要空格,需要在表达式的外面加双引号
    /> echo $num    #如果没有声明declare -i num,该命令将返回5+5
    10
    /> num="5 * 5"
    /> echo $num
    25
    /> declare strnum
    /> strnum=5+5
    /> echo $strnum #由于并未将strnum声明为数值型,因此该输出将按字符串方式处理。
    5+5
    Shell
还允许我们以不同进制的方式显示数值型变量的输出结果,其格式为:进制+#+变量。
    /> declare -i x=017 #017其格式为八进制格式
    /> echo $x           #缺省是十进制
    15
    /> x=2#101         #二进制
    /> echo $x
    5
    /> x=8#17           #八进制
    /> echo $x
    15
    /> x=16#b           #十六进制
    /> echo $x
    11
    Shell中还提供了一个内置命令let,专门用于计算数学运算的,见如下示例:
    /> let i=5
    /> let i=i+1
    /> echo $i
    6
    /> let "i = i + 2"
    /> echo $i
    8
    /> let "i+=1"
    /> echo $i
    9