Shell脚本中使用与不使用反引号`的区别是什么?附示例代码
Shell脚本中反引号`的作用与区别解析
嘿,这个问题戳中了Shell脚本里一个基础却容易踩坑的点!咱们直接结合你给出的两段代码来拆解清楚:
反引号`的本质:命令替换
反引号在Shell里是命令替换的核心语法,它的作用很直白:执行反引号包裹的命令,然后把命令的输出结果替换掉整个反引号部分——简单说就是「把命令跑一遍,拿结果当字符串用」。
两段代码的实际行为对比
第一段(使用反引号):
if [ "`/usr/bin/whoami`" != "root" ] ; then /bin/echo "This script must be run as root or sudo." exit 0 fi
Shell执行这段代码时,会优先处理反引号里的内容:
- 运行
/usr/bin/whoami命令,得到当前登录用户的用户名(比如root用户执行就返回root,普通用户返回你的用户名) - 把这个结果替换进条件判断,变成类似
if [ "root" != "root" ](root用户时)或if [ "yourname" != "root" ](普通用户时) - 这样就能正确判断用户身份:只有普通用户会触发提示并退出,root用户会跳过这个分支继续执行脚本。
第二段(不使用反引号):
if [ "/usr/bin/whoami" != "root" ] ; then /bin/echo "This script must be run as root or sudo." exit 0 fi
这里没有反引号,Shell会直接把"/usr/bin/whoami"当成普通字符串处理:
- 它会直接对比字符串
/usr/bin/whoami和root,这俩显然完全不相等 - 不管你当前是不是root用户,这个条件都会成立,脚本永远会输出提示并退出,根本起不到判断用户身份的作用!
额外小提示:更推荐的命令替换写法
现在的Shell脚本里,更推荐用$()代替反引号做命令替换,比如把第一段代码改成:
if [ "$(/usr/bin/whoami)" != "root" ] ; then /bin/echo "This script must be run as root or sudo." exit 0 fi
$()的优势是支持嵌套(比如$(echo $(date +%Y))),可读性也更强;反引号在嵌套时需要转义,容易出错。不过反引号是兼容更老版本Shell的写法,所以很多旧脚本还在使用。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

