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

Linux 我可以使用ECHO执行命令吗?,linux,shell,printing,scripting,echo,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

我想出了一个很酷的脚本,它将产生我需要的输出,但它只显示在屏幕上,所以我必须复制,然后粘贴到命令中,让它们执行。以下是我的脚本的缩写版本:

#!/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是否有一些选项可以实际运行命令,而不仅仅是打印行?

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

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

# ... and so on

# now execute it:
$cmd
-
告诉bash应该从stdin读取命令


但是,如果您没有搜索快速解决方案,也可以动态地构建和执行该命令。像这样:

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

# ... and so on

# now execute it:
$cmd

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

eval $cmdstring

改用
grep-E
和模式:

$runc $IP    $cc | grep -E 'Algeria|Argentina|...'
说明:
echo
将打印命令,但不执行它。只需忽略它即可实际执行命令

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

你应该使用

cc=$(geoiplookup $IP)

而不是回跳;更安全。

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

eval $(echo -e $runc $IP    $cc | grep Algeria)
这将在子shell中处理您的echo,输出将像您在shell中键入它一样执行,然后按enter键

请参见以下bash手册中的练习:

评估[参数…] arg被读取并连接到一个命令中。然后,shell读取并执行该命令,其退出状态返回为 评估的价值。如果没有参数,或者只有空参数,eval将返回0


上面的命令对我有效。

只需将您的命令放在括号中,如下所示:

echo $(ls)
您还可以在命令之前添加文本

echo "The date is $(date)"
比如说

echo "Enter Text Here $(Command Here)"

您还可以将
for
循环导入
bash
for x in。。。;做完成| bash-
@glennjackman我不确定,而且懒得测试;)。。。对我来说,管道化循环输出听起来是最好的解决方案。thxI已回滚您在问题本身中包含的答案。请发布您自己的答案或批准现有答案中的一个。请注意,您的解决方案与Flo Doe的答案几乎相同。