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

标签 bash function parameter-passing

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

#!/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/

相关文章:

bash - golang - 在空的 bash 窗口中打开文件

linux - crontab 用于调度 shell 脚本

linux - SUSE Linux 中的 bash_profile 在哪里

linux - 如何删除文件名的这些部分?

c - 使用指向另一个函数的指针传递数组

JavaScript 将参数传递给保持参数数据完整的函数

c - 在 C 中传递和返回变量

javascript - 如何阻止父事件触发?

c++ - 为函数提供默认参数,但该参数是一个结构体

ios - 如何使用带有 Swift 3.0 的按钮将值从 ViewController 传递到另一个 ViewController