我尝试将包含命令,管道和变量的参数传递给函数。
#TST# Tue Aug 4 16:15:50 CEST 2015 CMD: ntpq -pn | awk '{ printf %s
结果我得到了
telnet localhost 5554
我搜索并尝试了好几个小时,但是我没有得到完整命令的预期结果。
如何使用命令,管道和变量来处理这样的参数?
答案 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