bash 使用命令、管道和变量处理参数的函数

bash function handling of parameter with commands, pipe and variables

我尝试将包含命令、管道和变量的参数传递给函数。

#!/bin/bash

CMD()
{
    echo "#TST# `date` CMD: "
}

CMD "ntpq -pn | awk '{ printf "%s %s\n", , }'"

结果我得到

#TST# Tue Aug  4 16:15:50 CEST 2015 CMD: ntpq -pn | awk '{ printf %s

我搜索并尝试了几个小时,但没有得到完整命令的预期结果。

如何使用命令、管道和变量处理这样的参数?

要事第一。您不能 可靠地将复杂命令粘贴在字符串中。有关此内容的讨论,请参阅 Bash FAQ 050

话虽这么说,你的问题 "simpler" 比那个要严重。

您的问题之一是引用未按照您的预期进行。

你期望这个命令:

CMD "ntpq -pn | awk '{ printf "%s %s\n", , }'"

将被 shell 解析为:

[CMD] ["ntpq -pn | awk '{ printf "%s %s\n", , }'"]

但事实并非如此。 "internal" 引号搞砸了(因为它们不是 shell 内部的)。

shell实际上是这样解析的:

[CMD] ["ntpq -pn | awk '{ printf "%s] [%s\n", , }'"]

所以 CMD 得到 两个 个参数而不是一个,因此当你尝试在 [=15] 中打印出 </code> 时你遇到了问题=]函数。</p> <p>转义那些 "inner" 双引号,你(几乎)得到你想要的:</p> <pre><code>$ CMD "ntpq -pn | awk '{ printf \"%s %s\n\", , }'" #TST# Tue Aug 4 10:28:24 EDT 2015 CMD: ntpq -pn | awk '{ printf "%s %s\n", ,0 }

郑重声明,语法高亮编辑器会让您了解这一点,就像将您的代码粘贴到 http://www.shellcheck.net/.

中一样

虽然 </code> 和 <code> 不见了,但这仍然不太正确。那是因为 shell 在双引号上下文中评估了它们。您也需要在那里转义 $ 以防止出现这种情况:

CMD "ntpq -pn | awk '{ printf \"%s %s\n\", $9,$10 }'"

综上所述,我想重申 Bash FAQ 050 使这成为一个糟糕的一般想法(假设您希望在某个时候使用该命令)。

CMD的调用中,简单地转义双引号和$符号。

改变

CMD "ntpq -pn | awk '{ printf "%s %s\n", , }'"

CMD "ntpq -pn | awk '{ printf \"%s %s\n\", $9,$10 }'"

注意:不这样做也会扩大变量。请参阅 this link 关于 bash 的引用