原文链接:http://wenx05124561.blog.163.com/blog/static/124000805201281473457696/
1. quoting
常用的 quoting 有如下三种方法:
* hard quote:' ' (单引号),所有meta均被关闭,除了自己,只能配对。
* soft quote: " " (双引号),大部份meta都会被关闭,但保留$、`反引号、\反斜杠,自己只能配对。
* escape : \ (反斜线),只有紧接在 \之后的单一meta才被关闭。
'(单引号)组合的优先级比\高 echo ‘Hatter\'s tea party 输出Hatter\s tea party
IFS元素放在hard/soft quote, escape中就不当IFS 只当做空格三中的一种
$ A=B C # 空白鍵未被关闭,作為 IFS 处理, A=B当第一个命令, C当第二个就无效了。
$ C: command not found.
$ echo $A
$ A="B C" # 空白鍵已被关闭,仅作为空白鍵处理。
$ echo $A
B C
2. 命令替换
a. 反引号`
反引号用于设置系统命令的输出到变量,将其看作一条命令执行它,并保存结果。
echo `date`
Sat Nov 20 21:40:47 CST 2010
b. $()
count=$(echo $1 | sed 's/^-//') #命令替换 相当于``反引号,用于赋值
` ` 需要额外的逃脱符( \` )处理,而 $( ) 則比較直觀。
command1 `command2 `command3` `
原本的意图是要在 command2 `command3` 先將 command3 提换出來给 command 2 处理,然后再将结果传递給 command1 `command2 ...` 來处理。
然而,真正的结果在命令行中却是分成了 `command2 ` 与 `` 兩段。
正确的输入应该:command1 `command2 \`command3\` `
要不然,换成 $( ) 就没有问题了:
command1 $(command2 $(command3))
3. wildcard
wildcard匹配符号,在Command Line的位置里, wildcard只作用于argument的path上.
a. * 匹配任意
b. ? 匹配单个字符
c. [] 匹配字符集 :[a-zA-Z] [!a-z] 前面加!全否定 用[\!]匹配!
d. {string1,string2...} 匹配字符串 a{ss,dd,ee}m 匹配 assm addm aeem {2..5} 2 3 4 5
tips:
a. *.txt 并不能匹配 .txt 但可匹配 1.txt 这样的路径名称.
b. 1*txt 及 1?txt 均可匹配 1.txt这样的路径名称
区分出 shell meta 与 command meta
前面我们提到的那些 meta ,都是在 Command Line 中有特殊用途的,
比方說 { } 是將其內一系列 command line 置于不具名的函数中执行,但是,awk却需要用 { } 來区分出 awk 的命令段(BEGIN, MAIN, END)。
若你在 Command Line 中如此輸入:$ awk {print $0} 1.txt
由於 { } 在 shell 中並沒关闭,那 shell 就讲 {print $0} 视为函数 ,但同時又沒有" ; "符號作命令区分,因此就出现awk 的语法错误。
要解决之,可用 quote :
$ awk '{print $0}' 1.txt
awk "{print \$0}" 1.txt
awk \{print\ \$0\} 1.txt
这几个的 { 符号 shell meta 关闭,避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta 。