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

时间:2015-08-04 14:23:24

标签: bash function parameter-passing

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

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

结果我得到了

telnet localhost 5554

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

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

2 个答案:

答案 0 :(得分:5)

首先要做的事情。您无法可靠地将复杂命令粘贴到字符串中。有关此问题的讨论,请参阅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时,您会遇到问题。< / p>

逃避那些“内在的”双引号,你(几乎)得到你想要的东西:

$ 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使这个想法变得糟糕(假设您希望在某些时候使用该命令)。

答案 1 :(得分:4)

CMD的通话中,只需转义双引号和$符号。

更改

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

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

注意:不这样做也会扩展变量。有关bash引用的信息,请参阅this link