文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>使用$()代替``进行命令替换

使用$()代替``进行命令替换

时间: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)这样的嵌套你敢用吗?多重呢?
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载