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