gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:35:11 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com