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

问题描述 投票:0回答:7

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

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

linux shell printing scripting echo
7个回答
48
投票

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

echo $(ls)

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

echo "The date is $(date)"

例如

echo "Enter Text Here $(Command Here)"

26
投票

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

yourscript | bash -

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


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

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

# ... and so on

# now execute it:
$cmd

14
投票

您可以使用

eval
来执行字符串:

eval $cmdstring

10
投票

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

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

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

请参阅以下 bash 手册摘录:

评估[参数...] args 被读取并连接在一起形成一个命令。然后 shell 读取并执行该命令,其退出状态返回为 评估的价值。如果没有参数或只有空参数,则 eval 返回 0。


7
投票
echo `pwd`

上面的命令对我有用。


0
投票

使用

grep -E
和图案代替:

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

说明:

echo
会打印命令但不执行它。只需省略它即可实际执行命令。

不要运行脚本 5 次,而是使用

grep
一次搜索五个模式中的任何一个。

你应该使用

cc=$(geoiplookup $IP)

代替反引号;这样更安全。


0
投票

您应该像这样进一步管道这些

echo
grep
命令:

...
echo -e "$runc $IP    $cc" | grep Algeria | sh
...

我们以这个命令为例:

echo -e "echo AAA\necho BBB\necho CCC"

输出:

echo AAA
echo BBB
echo CCC

可以说我只需要

AAA
:

echo -e "echo AAA\necho BBB\necho CCC" | grep AAA

输出:

echo AAA

现在实际执行该操作

echo AAA
:

  • sh
    bash
echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | sh
  • xargs
echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | xargs command

两者都返回:

AAA

如果您确实需要

both
echo 并执行命令,则可以使用 tee

echo -e "echo AAA\necho BBB\necho CCC" | grep AAA | tee /dev/tty | sh

出:

echo AAA
AAA

xargs
sh
/
bash
可能并不总是按预期工作,例如:

echo "echo echo | rev" | tee /dev/tty | xargs command
echo echo | rev
echo | rev

与:

echo "echo echo | rev" | tee /dev/tty | sh
echo echo | rev
ohce
© www.soinside.com 2019 - 2024. All rights reserved.