Wednesday, 13 June 2007

shell中的引号

shell可以识别4种不同类型的引字符号: 单引号字符’ 双引号字符” 反斜杠字符\ 反引号字符`

1. 单引号

howard@0[script]$ grep Susan phonebook

Susan Goldberg 403-212-4921

Susan Topple 212-234-2343

如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldberg和phonebook当作需要搜索的文件

howard@0[script]$ grep ‘Susan Gold’ phonebook

Susan Goldberg 403-212-4921

当shell碰到第一个单引号时,它忽略掉其后直到右引号的所有特殊字符

2. 双引号

双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,`

howard@0[script]$ x=*

howard@0[script]$ echo $x

hello.sh menus.sh misc.sh phonebook tshift.sh

howard@0[script]$ echo ‘$x’

$x

howard@0[script]$ echo “$x”

*

这个例子可以看出无引号、单引号和双引号之间的区别。在最后一种情况中,双引号告诉shell在引号内照样进行变量名替换,所以shell把$x替换为*,因为双引号中不做文件名替换,所以就把*作为要显示的值传递给echo。

对于第一种情况需要进一步说明,shell在给变量赋值时不进行文件名替换(这从第三种情况中也能看出来),各步骤发生的精确次序如下:

shell扫描命令行,把x的值设为星号*;

shell再次扫描命令行,碰到星号*,把它替换成当前目录下的文件清单;

shell启动执行echo命令,把文件清单作为参数传递给echo.

这个赋值的先后次序非常重要:shell先作变量替换,然后作文件名替换,最后把这行处理为参数

3. 反斜杠

反斜杠的基本作用等价于在一个字符前后加上单引号,反斜杠引用紧跟其后的字符,即\c基本上等价于’c'。但这一原则有一点例外,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。

双引号中的反斜杠去掉字符的特殊意义。

4. 命令替换(“)

命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(…)结构括起来,其中,$(…)格式受到POSIX标准支持,也利于嵌套。

howard@0[script]$ echo The date and time is `date`

The date and time is 三 6月 15 06:10:35 CST 2005

howard@0[script]$ echo Your current working directory is $(pwd)

Your current working directory is /home/howard/script

参数传递

系统变量$#,记录命令行中所键入参数的个数

系统变量$*,记录传递给程序的所有参数,在参数不确定或者参数可变的程序中,这通常很有用

系统变量$1,…,$9,${n} 记录相应位置的参数(当n大于10时,需要使用${n}格式)

shift命令,其作用是把参数位置左移。把原来$2中的内容赋给$1,以次类推,$1中的值丢失。

示例:


howard@0[script]$ cat tshift.sh


echo $# $*


shift


echo $# $*


shift


echo $# $*


shift


echo $# $*


shift


echo $# $*


shift


运行该脚本


howard@0[script]$ tshift.sh a b c d


4 a b c d


3 b c d


2 c d


1 d


0


另外,$?变量保存shell最后所指令命令的退出状态

No comments:

My photo
London, United Kingdom
twitter.com/zhengxin

Facebook & Twitter