我可以使用ECHO来执行命令吗?

我已经想出了一个很酷的小脚本,它会生成我需要的输出,但是它只显示在屏幕上,所以我必须复制,然后粘贴命令来执行它们。 这里是我的脚本的缩写版本:

#!/bin/bash runc=/etc/csf/csf.pl -d for IP in `tail -400 iptext.txt` do cc=`geoiplookup $IP` echo -e $runc $IP $cc | grep Algeria echo -e $runc $IP $cc | grep Argentina echo -e $runc $IP $cc | grep Armenia echo -e $runc $IP $cc | grep Azerbaijan echo -e $runc $IP $cc | grep Bolivia echo -e $runc $IP $cc | grep Brazil done 

好的,在iptext.txt中遍历IP地址列表,然后在每个地方执行geoIP查找,如果(在这个例子中)列表中有两个geoIP匹配,比方说亚美尼亚和巴西,我会看到输出像这样的shell窗口:

 /etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia /etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil 

这太好了,但是我不仅需要输出,而且还希望运行/etc/csf/csf.pl -d命令,并阻止(仅限且仅限于)与国家/地区名称匹配的行中的IP名单。

我已经用我有限的shell脚本知识尝试了各种各样的东西,但到目前为止,似乎没有任何工作。 那么是否有一些ECHO的选项,我错过了实际运行命令,而不是只是打印出行?

非常感谢!

更新:没关系,我解决了eval函数的问题,如下所示:

eval“echo -e $ runc $ IP $ cc | grep阿尔及利亚”

一个不需要修改脚本的简单方法就是将命令的输出传送到另一个bash实例。 喜欢这个:

 yourscript | bash - 

-告诉bash它应该从标准输入读取命令。


但是,如果您不寻找快速解决方案,则可以动态构建和执行命令。 喜欢这个:

 cmd="ls" if [ "foo" != "bar" ] ; then cmd="$cmd -a" then # ... and so on # now execute it: $cmd 

你可以使用eval来执行一个字符串:

 eval $cmdstring 

有一个bash内建的eval,它执行的命令就像在你的shell中输入一样。 例如在你的脚本中,你可以执行以下操作:

 eval $(echo -e $runc $IP $cc | grep Algeria) 

这将在一个子shell中处理你的回声,输出将像你在你的shell中输入,然后输入。

请参阅下面的bash手册exerpt:

eval [arg …]参数被读取并连接成一个命令。 这个命令然后被shell读取和执行,并且它的退出状态作为eval的值被返回。 如果没有参数,或者只有null参数,则eval返回0。

使用grep -E和模式代替:

 $runc $IP $cc | grep -E 'Algeria|Argentina|...' 

说明: echo将打印命令但不执行它。 只是省略它来实际执行命令。

而不是运行脚本5次,使用grep一次搜索五种模式中的任何一种。

你应该使用

 cc=$(geoiplookup $IP) 

而不是反引号; 更安全

 echo `pwd` 

上面的命令适合我。

只要把你的命令做成这样的假设:

 echo $(ls)