34

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

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

4

6 回答 6

33

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

echo $(ls)

您还可以在命令之前添加文本

echo "The date is $(date)"

例如

echo "Enter Text Here $(Command Here)"
于 2017-07-29T13:32:08.880 回答
23

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

yourscript | bash -

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


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

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

# ... and so on

# now execute it:
$cmd
于 2013-07-16T10:30:35.800 回答
12

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

eval $cmdstring
于 2013-07-16T10:38:00.420 回答
9

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

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

这将在子 shell 中处理您的回显,并且输出将像您在 shell 中键入然后回车一样执行。

请参阅下面的 bash 手册摘录:

eval [arg ...] args 被读取并连接到一个命令中。该命令随后被 shell 读取并执行,其退出状态作为 eval 的值返回。如果没有参数或只有空参数,则 eval 返回 0。

于 2013-07-16T10:41:30.617 回答
2
echo `pwd`

上面的命令对我有用。

于 2017-03-16T18:00:56.327 回答
0

改用grep -Eand 模式:

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

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

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

你应该使用

cc=$(geoiplookup $IP)

而不是反引号;它更安全。

于 2013-07-16T10:41:13.333 回答