Linux 中 shell 中反引号与 $() 的对比

这两者都是命令替换,命令替换是指:是Shell 执行命令并将命令替换部分替换为执行该命令后的结果。

比如:

[bob@centos home]$ val=hello
[bob@centos home]$ echo $(echo $val)
hello
[bob@centos home]$ echo `echo $val`
hello

或者:

[bob@centos home]$ echo $(date)
2017年 06月 25日 星期日 20:24:20 CST
[bob@centos home]$ echo `date`
2017年 06月 25日 星期日 20:24:28 CST

区别:
反引号是 Bourne shell遗留下来的。
()POSIX ()对命令的嵌套更清晰,更方便。
主要提倡使用$() 而不是 使用反引号有以下几个原因:

(1)当你写了这种命令使用反引号是会眼花的。而使用括号就清晰很多,嵌套也很方便。

libdir=$(dirname $(dirname $(which gcc)))/lib

libdir=`dirname \`dirname \\\`which gcc\\\`\``/lib

(2)还有一个原因对反斜杠的处理
只有两个反斜杠时

[bob@centos home]$ echo "`echo \\a`"; echo "$(echo \\a)"
a  
\a

增加后

[bob@centos home]$ echo "`echo \\\a`"; echo "$(echo \\\a)"
\a
\a

在加一个

[bob@centos home]$ echo "`echo \\\\a`"; echo "$(echo \\\\a)"
\a
\\a

面对单引号中如此诡异的行为,我有点发虚。
在看看在括号中,将反斜杠当做转义,都可以解释清楚。

(3)反引号 嵌套使用需要反斜杠转义

[bob@centos home]$ echo $(echo $(date))
20170625日 星期日 20:42:32 CST
[bob@centos home]$ echo `echo `date``
date
[bob@centos home]$ echo `echo \`date\``
20170625日 星期日 20:42:42 CST
[bob@centos home]$ 

综上所述:$() 是被提倡使用的也是首选方法,它具有清晰的语法,提高人的可读性,嵌套很直观,内部解析分开的对反引号的解析也符合人们的常识。而反引号是不被推荐的,其容易伪装的语法,而外观极其像单引号,而不推荐被使用。

参考:

What is the benefit of using $() instead of backticks in shell scripts?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值