一、字符
字符分为两种:普通字符和特殊字符(meta)。
普通字符就是abcd、123456 等这些字符。
特殊字符(meta)具有特殊的含义,常用的有:
- IFS(inter frame spacing)帧间隔:包括空格、TAB和回车
- = 设定变量。
- $ 作变量或运算替换(请不要与shell prompt 搞混了)。
- > 重导向 stdout。
- < 重导向 stdin。
- | 命令管线。
- & 重导向file descriptor ,或将命令置于背境执行。
- ( ) 将其内的命令置于nested subshell 执行,或用于运算或命令替换。
- { } 将其内的命令置于non-named function 中执行,或用在变量替换的界定范围。
- ; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。
- && 在前一个命令结束时,若返回值为true,继续执行下一个命令。
- || 在前一个命令结束时,若返回值为false,继续执行下一个命令。
- ! 执行 history 列表中的命令。
如果要关闭这些特殊字符的特殊含义,方法:
- ' ' (单引号),屏蔽任何特殊字符的特殊含义。
- " " (双引号),除$(美元符)、 `(反引号)、 \(反斜线)外, 屏蔽其它的特殊字符。
- \ (反斜线),当反斜线有特殊含义时,紧接在其后的一个特殊字符才会被屏蔽。
例子:
$ 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
|
注意: 这里$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) |