Bash脚本 - 字符串中的字符串作为选项值

时间:2015-05-29 13:25:44

标签: bash

我使用nfcapd来捕获Netflow导出数据包。它有一个-x选项,可在新的流输出文件可用时调用另一个程序。我想在新文件可用时调用nfdump,所以我像这样运行nfcapd:

#!/bin/bash
t="nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x \"nfdump -r %d%f \""
echo $t
eval $t

当我在屏幕上看到它的输出时,它会调用nfdump。

我将路径从nfcapd传递给新文件到nfdump中的-r选项。

我的问题是我需要将fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc作为参数传递给nfdump,这是一个字符串来告诉它我想要什么类型的流信息,所以它需要在引号中。我试过逃避报价,但我无处可去。到目前为止,这是我的脚本:

#!/bin/bash
t1="nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x  \"nfdump -r %d%f -o \\\"fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc\\\" \" "
echo $t1
eval $t1

但是nfdump并不喜欢格式,因为打印了帮助信息。

我对bash相当新,所以可能有一个非常简单的解决方案。任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,您可以通过使用辅助函数(在下面的示例中称为output_and_exec())来删除一级引号,该函数输出并执行传递给它的内容。然后,在将命令传递给nfcapd时使用单引号。这些单引号可以包含除单引号之外的任何字符,因此只需使用双引号作为nfdump的参数。

output_and_exec() { echo "$@" ; "$@" ; }
output_and_exec nfcapd -p 5566 -l /root/nfcapd_log/ -t 5 -x  'nfdump -r %d%f -o "fmt: %ts %te %td %pr %sa %da %sp %dp %ra %in %out %pkt %ipkt %opkt %ibyt %obyt %fl %dir %ismc %odmc %idmc %osmc"' 

免责声明:由于我没有参加nfapd / nfdump计划,我没有对此进行过测试。