![使用 eval 在变量中执行命令](https://linux22.com/image/3085/%E4%BD%BF%E7%94%A8%20eval%20%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
我正在尝试使用 grep 为一些日志文件着色。我写了一个脚本,其中一部分如下所示:
#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always '[^a-zA-Z0-9]' $log |less -R"
log="/var/log/syslog"
eval $com
执行过程中缺少 $log !
我试过这个:
#!/bin/bash
com="`GREP_COLOR=\"1;36\" egrep --color=always '[^a-zA-Z0-9]' $log |less -R`"
log="/var/log/syslog"
eval $com
什么都没发生 !
你能看出我的代码有什么错误吗?
答案1
在这里,它完全可以避免:
function color_log() {
log=$1
GREP_COLOR="1;36" egrep --color=always '[^a-zA-Z0-9]' $log | less -R
}
color_log "/var/log/syslog"
答案2
您需要在第一个脚本中转义$
in :$log
#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always '[^a-zA-Z0-9]' \$log |less -R"
log="/var/log/syslog"
eval $com
编辑:
在这种特殊情况下确实没有必要使用eval
,因此建议像 ДМИТРИЙ 那样的替代且更安全的方法绝对是首选。另一方面,虽然设计错误是eval
首先使用,但我解决的编码错误不是引用$log
。虽然eval
由于与之相关的所有漏洞而肯定有合理的负面新闻,但它仍然是一个非常强大的指令,值得了解。仔细编写评估可以避免恶意或意外的代码执行。