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 的引用
我尝试将包含命令、管道和变量的参数传递给函数。
#!/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 的引用