【问题标题】:Can I use ECHO to execute commands?我可以使用 ECHO 执行命令吗?
【发布时间】:2023-11-15 15:56:02
【问题描述】:

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

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

【问题讨论】:

  • 我已回滚您在问题本身中包含的答案。请发布您自己的答案或批准现有答案之一。请注意,您的解决方案与 Flo Doe 的答案几乎相同。

标签: linux shell printing scripting echo


【解决方案1】:

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

echo $(ls)

命令前也可以有文字

echo "The date is $(date)"

举例

echo "Enter Text Here $(Command Here)"

【讨论】:

    【解决方案2】:

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

    yourscript | bash -
    

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


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

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

    【讨论】:

    • 您还可以将for 循环通过管道传输到bash: for x in ...; do ...; done | bash -
    • @glennjackman 我不确定,也懒得测试 ;) ... 管道循环的输出对我来说是最好的解决方案。谢谢
    【解决方案3】:

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

    eval $cmdstring
    

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:
        echo `pwd`
        

        上面的命令对我有用。

        【讨论】:

          【解决方案6】:

          改用grep -E 和模式:

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

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

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

          你应该使用

          cc=$(geoiplookup $IP)
          

          而不是反引号;更安全。

          【讨论】:

            最近更新 更多