Linux日常——shell脚本中 “`”、“$()”、eval 的区别

时间:2021-11-17 09:11:39

shell中的命令替换可以使用:
` 或 $()
由反引号括起来的也是⼀条命令,Shell先执⾏该命令,然后将输出结果⽴刻代换到当前命令⾏
中。
但在某些特殊情况下,它们还是有区别的:

#!/bin/bash
echo `echo \\\\ `
echo $(echo \\\\ )

Linux日常——shell脚本中 “`”、“$()”、eval 的区别

#!/bin/bash
echo `echo \$PATH `
echo `echo \\$PATH `
echo $(echo \$PATH )

Linux日常——shell脚本中 “`”、“$()”、eval 的区别
可以得出以下结论:

  1. 在倒引号“`”中,倒引号其本身就对\进行了转义,保留了其本身意思,如果想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示: \ = \
  2. $()中与我们平常使用的一样:\ = \

eval

功能:
告知shell取出eval的参数,然后按照参数特性来执行。参数数目不限,彼此用分号隔开。
区别:
eval会对后面命令进行两次扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用, 则保证间接引用的语义。
前面提到的两种替换方式都只对要替换的部分进行一次扫面
即,eval命令将会首先扫描命令行进行所有的置换,然后执行该命令,所以,eval适用于那些一次扫描无法实现其功能的变量。
执行步骤:
1.变量替换,类比宏替换或include
2.执行替换后的命令
下面是几条复杂命令,eval会对其进行两次扫描
例1:
Linux日常——shell脚本中 “`”、“$()”、eval 的区别
例2:
Linux日常——shell脚本中 “`”、“$()”、eval 的区别
eval可以获取shell的最后一个参数
Linux日常——shell脚本中 “`”、“$()”、eval 的区别

Linux日常——shell脚本中 “`”、“$()”、eval 的区别

在我们已知参数个数时,可以直接使用echo命令查看参数值,可是当我们不知道参数总数时,可以使用eval获得
Linux日常——shell脚本中 “`”、“$()”、eval 的区别
注意:
eval不能获得函数处理结果
eval命令不可嵌套