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

时间:2013-07-16 10:27:39

标签: linux shell printing scripting 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是否有一些选项我错过了实际运行命令而不仅仅是打印出来的?

6 个答案:

答案 0 :(得分:15)

一种不需要修改脚本的简单方法是将命令的输出传递给另一个bash实例。像这样:

yourscript | bash -

-告诉bash应该从stdin读取命令。


但是,如果您不是在寻找快速解决方案,那么也可以动态地构建和执行命令。像这样:

cmd="ls"
if [ "foo" != "bar" ] ; then
    cmd="$cmd -a"
then

# ... and so on

# now execute it:
$cmd

答案 1 :(得分:9)

您可以使用eval执行字符串:

eval $cmdstring

答案 2 :(得分:8)

将命令放入括号中:

echo $(ls)

您还可以在命令

之前使用文本
echo "The date is $(date)"

例如

echo "Enter Text Here $(Command Here)"

答案 3 :(得分:6)

有一个bash内置eval,它执行类似于在shell中输入的命令。例如,在您的脚本中,您可以执行以下操作:

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

这将在子shell中处理你的echo,输出将像你在shell中键入它然后输入一样执行。

请参阅下面的bash手册:

  

eval [arg ...]                 args被读取并连接成一个命令。然后shell读取并执行此命令,并返回其退出状态                 eval的值。如果没有args或只有null参数,则eval返回0。

答案 4 :(得分:0)

使用grep -E和模式代替:

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

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

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

你应该使用

cc=$(geoiplookup $IP)
而不是反击;它更安全。

答案 5 :(得分:0)

echo `pwd`

以上命令对我有用。