shell 学习三之特殊 meta

原文链接: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 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值