- 论坛徽章:
- 1
|
shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
读网中人十三问的第四问的理解:
1、变量一定得用""
2、处理顺序要搞清楚:这两行一定要牢牢记在脑中
命令格式
command-name options argument
处理过程:
shell 会依据 IFS(Internal Field Seperator) 将 command line 所输入的文字给拆解为"字段"(word)。
然后再针对特殊字符(meta)先作处理,
最后再重组整行 command line 。
3、例子:
空格的好理解,但CR字符不好理解,如'',""
- $ A='B
- > C
- > '
- $ echo "$A"
- B
- C
- $ echo $A
- B C
复制代码
echo 的$A加上soft quote后,得出的结果不同了,
第一个是断行字符(new line),取消了CR和IFS的功能
第二个应该是一个空格了,仅取消CR功能,而保留IFS功能
第三个是CR
原因如下:
然而,由于 echo $A 时的变量没至于 soft quote 中,因此当变量替换完成后并作命令行重组时,<enter> 会被解释为 IFS (空格键),而不是解释为 New Line (换行符)字符。
而在escape中
- $ A=B\
- > C\
- >
- $ echo $A
- BC
- $ echo "$A "
- BC
复制代码
得出的结果是BC,原因:
<enter> 键本身在 shell meta 中的特殊性,在 \ 跳脱后面,仅仅取消其 CR 功能,而不会保留其 IFS 功能(空格)。 因此就是(NULL)
因此在上面两个例子中 <enter> 键所产生的字符有四种:
CR (结束命令)
IFS (空格)
NL(New Line) (断行)
NULL (空)
不知我的理解是否正确,还望各位指点,呵呵,我感觉这样说好像更容易理解 
上面理解了,下面就不难了,找个地方放一下,俺怕自己给忘了
而接下来的例子中,则要理解shell meta 与 command meta
有些meta ,都是有特殊用途的,比如 { } ,但在awk中 却要用 { } 来区分出 awk 的命令区段(BEGIN, MAIN, END),也就是双方都用到了{}
如果输入下例命令就会出错:
这是因为 { } 在 shell 中并没关闭,那 shell 就将 {print $0} 视为command block , 而不是awk的参数,但同时又没有" ; "符号作命令区隔,因此就出现 awk 的语法错误结果。
要解决之,可用 hard quote :
将原本的 {、<space>、$(注三)、} 这几个 shell meta 关闭, 避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。
( 注三:而其中的 $0 是 awk 内建的 field number ,而非 awk 的变量,awk 自身的变量无需使用 $ 。)
要是理解了 hard quote 的功能,再来理解 soft quote 与 escape 就不难:
- awk "{print \$0}" 1.txt
- awk \{print\ \$0\} 1.txt
复制代码
第一行:由于soft quote中没法关闭$,因此用\来关闭$meta
第二行:\{关闭{,\ (\空格,关闭空格键),\$,\}就不用说了
如果awk 的 $0 的 0 值是从另一个 shell 变量读进
比方说:已有变量 $A 的值是 0 ,那如何在 command line 中解决 awk 的 $$A 呢? 那么 hard quoe 就不可行了:
代码:
- $ awk '{print $$A}' 1.txt
复制代码
因为 $A 的 $ 在 hard quote 中是不能替换变量的。
可以使用如下几种方案:
- A=0
- awk "{print \$$A}" 1.txt
- awk \{print\ \$$A\} 1.txt
- awk '{print $'$A'}' 1.txt
- awk '{print $'"$A"'}' 1.txt # 注:"$A" 包在 soft quote 中
复制代码
上面得注意$和''和""的包含位置 |
|