使用$()代替``进行命令替换
时间:2007-12-20 来源:njubee
开张第一篇, 发现自己写文字的能力太差了, 所以先写个简单的东西
命令替换是指将命令的输出作为命令替换的位置的文本
命令替换的一般作用是抽取一个命令的输出, 然后使用=操作赋值到一个变量
供以后使用
可以使用`cmd`(反引号,tab键上面的那个)或者 $(cmd), 如:
curr_path=`pwd` # curr_path为当前路径
rm `cat filename` # "filename"包含了需要被删除的文件的列表
wc -c $(find . -type f) # 计算每个文件大小
上面的命令由于简单,使用``没问题,
如果命令中有转义就麻烦了, 因为\也是``的转义符,不注意的情况下出现
不是预想的结果, 而且还很难查出bug
$()就不一样了, 你在命令行上任何一条正确的命令都可以用$()
$(任意正确命令)
`转义后的正确命令`
可见还是$()好用
比较如下两个命令:
slashlines=`grep -F "\\" filename` (1)
slashlines=$(grep -F "\\" filename) (2)
这里grep命令作用是 在文件中找出包含\的行
在命令行上的命令是: (-F不使用正则表达式)
grep -F "\\" filename (1c)
如果不用-F的话是:
grep "\\\\" filename (2c)
(因为\也是grep的正则表达式的转义符)
再比较
slashlines=`grep "\\\\" filename` (3)
slashlines=$(grep "\\\\" filename) (4)
使用``(3)还是错, 而且错的结果不一样
(1) 是bash报错, (3) 是grep报错
总之是因为\也是``的转义符, 执行的实际命令已经
不是(1c)或(2c)了
使用``的正确式子是:
slashlines=`grep -F "\\\\" filename` (11)
slashlines=`grep "\\\\\\\\" filename` (33)
看33式, 由于\是``和""和grep的正则表达式的转义符
所以导致的结果是由8个\, 太可怕了,
而(2), (4) 里面的命令跟(1c),(2c)是一模一样的
太多的东西是以\为转义符, 所以建议爱惜生命,使用$().
还有$()支持多重嵌套, 使用更加灵活
fatherpath=$(dirname $(pwd))
后记:
我原来以为\`就是``里面的`字符, 像c语言里使用\", 如"ab\"cd",
实际不是, \`实际是``命令替换的嵌套, 所以说``也支持嵌套
fatherpath=`dirname \`pwd\``
所以1)这样我根本不知道``里面的`怎么表示
2)这样的嵌套你敢用吗?多重呢?
命令替换是指将命令的输出作为命令替换的位置的文本
命令替换的一般作用是抽取一个命令的输出, 然后使用=操作赋值到一个变量
供以后使用
可以使用`cmd`(反引号,tab键上面的那个)或者 $(cmd), 如:
curr_path=`pwd` # curr_path为当前路径
rm `cat filename` # "filename"包含了需要被删除的文件的列表
wc -c $(find . -type f) # 计算每个文件大小
上面的命令由于简单,使用``没问题,
如果命令中有转义就麻烦了, 因为\也是``的转义符,不注意的情况下出现
不是预想的结果, 而且还很难查出bug
$()就不一样了, 你在命令行上任何一条正确的命令都可以用$()
$(任意正确命令)
`转义后的正确命令`
可见还是$()好用
比较如下两个命令:
slashlines=`grep -F "\\" filename` (1)
slashlines=$(grep -F "\\" filename) (2)
这里grep命令作用是 在文件中找出包含\的行
在命令行上的命令是: (-F不使用正则表达式)
grep -F "\\" filename (1c)
如果不用-F的话是:
grep "\\\\" filename (2c)
(因为\也是grep的正则表达式的转义符)
再比较
slashlines=`grep "\\\\" filename` (3)
slashlines=$(grep "\\\\" filename) (4)
使用``(3)还是错, 而且错的结果不一样
(1) 是bash报错, (3) 是grep报错
总之是因为\也是``的转义符, 执行的实际命令已经
不是(1c)或(2c)了
使用``的正确式子是:
slashlines=`grep -F "\\\\" filename` (11)
slashlines=`grep "\\\\\\\\" filename` (33)
看33式, 由于\是``和""和grep的正则表达式的转义符
所以导致的结果是由8个\, 太可怕了,
而(2), (4) 里面的命令跟(1c),(2c)是一模一样的
太多的东西是以\为转义符, 所以建议爱惜生命,使用$().
还有$()支持多重嵌套, 使用更加灵活
fatherpath=$(dirname $(pwd))
后记:
我原来以为\`就是``里面的`字符, 像c语言里使用\", 如"ab\"cd",
实际不是, \`实际是``命令替换的嵌套, 所以说``也支持嵌套
fatherpath=`dirname \`pwd\``
所以1)这样我根本不知道``里面的`怎么表示
2)这样的嵌套你敢用吗?多重呢?
相关阅读 更多 +