我尝试将包含命令、管道和变量的参数传递给函数。
#!/bin/bash
CMD()
{
echo "#TST# `date` CMD: $1"
}
CMD "ntpq -pn | awk '{ printf "%s %s\n", $9,$10 }'"
结果我得到
#TST# Tue Aug 4 16:15:50 CEST 2015 CMD: ntpq -pn | awk '{ printf %s
我搜索并尝试了几个小时,但我没有得到完整命令的预期结果。
如何使用命令、管道和变量处理这样的参数?
最佳答案
要事第一。您不能可靠地将复杂的命令粘贴到字符串中。有关此内容的讨论,请参见 Bash FAQ 050。
话虽如此,您的问题比那“简单”。
您的问题之一是引用没有按照您的预期进行。
你期望这个命令:
CMD "ntpq -pn | awk '{ printf "%s %s\n", $9,$10 }'"
被 shell 解析为:
[CMD] ["ntpq -pn | awk '{ printf "%s %s\n", $9,$10 }'"]
但事实并非如此。 “内部”引号搞砸了(因为它们不是 shell 内部的)。
shell 实际上解析了这个:
[CMD] ["ntpq -pn | awk '{ printf "%s] [%s\n", $9,$10 }'"]
因此 CMD
得到两个 参数而不是一个,因此当您尝试在 中打印出
函数。$1
时遇到了问题>CMD
转义那些“内部”双引号,你(几乎)得到你想要的:
$ CMD "ntpq -pn | awk '{ printf \"%s %s\n\", $9,$10 }'"
#TST# Tue Aug 4 10:28:24 EDT 2015 CMD: ntpq -pn | awk '{ printf "%s %s\n", ,0 }
郑重声明,语法高亮编辑器会让您了解这一点,就像将您的代码粘贴到 http://www.shellcheck.net/ 中一样。
尽管 $9
和 $10
丢失了,但这仍然不太正确。那是因为 shell 在双引号上下文中评估了它们。您也需要在那里转义 $
以防止出现这种情况:
CMD "ntpq -pn | awk '{ printf \"%s %s\n\", \$9,\$10 }'"
综上所述,我想重申 Bash FAQ 050 使这成为一个糟糕的一般想法(假设您希望在某个时候使用该命令)。
关于bash 函数使用命令、管道和变量处理参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31811918/