Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129042
  • 博文数量: 22
  • 博客积分: 1533
  • 博客等级: 上尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-30 11:09
文章分类

全部博文(22)

文章存档

2011年(1)

2010年(7)

2008年(14)

我的朋友

分类:

2010-10-03 14:42:43

一、字符

字符分为两种:普通字符和特殊字符(meta)。

普通字符就是abcd、123456 等这些字符。

特殊字符(meta)具有特殊的含义,常用的有:

  1. IFS(inter frame spacing)帧间隔:包括空格、TAB和回车
  2. =   设定变量。
  3. $    作变量或运算替换(请不要与shell prompt 搞混了)。
  4. >   重导向 stdout。
  5. <   重导向 stdin。
  6. |  命令管线。
  7. &   重导向file descriptor ,或将命令置于背境执行。
  8.  ( )  将其内的命令置于nested subshell 执行,或用于运算或命令替换。
  9. { }  将其内的命令置于non-named function 中执行,或用在变量替换的界定范围。
  10. ;   在前一个命令结束时,而忽略其返回值,继续执行下一个命令。
  11. &&  在前一个命令结束时,若返回值为true,继续执行下一个命令。
  12. ||  在前一个命令结束时,若返回值为false,继续执行下一个命令。
  13.  !  执行 history 列表中的命令。

如果要关闭这些特殊字符的特殊含义,方法:

  1.  ' ' (单引号),屏蔽任何特殊字符的特殊含义。
  2.  " " (双引号),除$(美元符)、 `(反引号)、 \(反斜线)外, 屏蔽其它的特殊字符。 
  3.  \ (反斜线),当反斜线有特殊含义时,紧接在其后的一个特殊字符才会被屏蔽。

例子:

$ aa=xue
$ echo "hu"$aa"lin"   前面两个双引号是一对, 后面两个是一对
huxuelin
$ echo 'hu'$aa'lin'      前面两个单引号是一对,后面两个是一对, 所以$aa 被解释为变量
huxuelin
$ echo "hu'$aa'lin"    由于双引号会屏蔽单引号,单引号就成了普通字符, 所以$aa 被解释为变量
hu'xue'lin
$ echo 'hu"$aa"lin'    由于单引号会屏蔽双引号,所以双引号就成了普通字符
hu"$aa"lin
$ echo 'hu" '$aa' "lin'  前面两个单引号是一对, 前面的那一个双引号是普通字符不需要配对, 所以$aa 被解释成变量
hu "xue" lin
$


二、subshell和代码块

subshell是一些放在( )中的命令, 这些命令会在子shell中执行。
适用: 让一些命令在不同的目录下执行, 这种情况可以不修改主脚本的目录。

代码块是放在{ } 中的命令, 这些命令在当前的shell下执行。
(注意: 花括号被视为shell关键字, 所以在开始花括号后紧跟空格或换行符,在结束花括号前放置换行符或分号)

三、awk的单引号

{}中放置的是命令集, 但在awk中需要用{}来区分awk的命令区段, 所以需要用''(单引号)来屏蔽其特殊含义。

$awk { print $0} ha.txt


由于{}的特殊含义没有被屏蔽, 所以{}中的语句被视为代码块,但又没有;(分号),所以出现语法错误。

$awk '{print $0}' ha.txt
$awk "{print \$0}" ha.txt
$awk \{print\ \$0\} ha.txt


注意: 这里$0为什么可以被替换?
$0是awk内建的字段变量, 而非awk的变量, awk自身的变量无需使用$(美元符)。

如果$0中的0值是从另一个shell变量中读进的呢?
比如: 变量$A的值是0, 在awk中如何使用$$A呢? 

$awk '{print $$A}' ha.txt

这样显然是不行的,$A无法替换。

解决方法:

$awk "{print \$$A}" ha.txt
$awk \{print\ \$$A\} ha.txt
$awk '{print $'$A'}' ha.txt


阅读(1249) | 评论(0) | 转发(0) |
0

上一篇:shell变量

下一篇:文件合并与分割命令

给主人留下些什么吧!~~