登录
首页 >  Golang >  Go问答

使用Golang将命令行输入传递给shell脚本执行

来源:stackoverflow

时间:2024-03-24 13:24:40 312浏览 收藏

使用 Golang 通过 `exec.command` 运行 shell 脚本时,可以利用 `fmt.Sprintf` 函数将命令行输入参数格式化并传递给脚本。`fmt.Sprintf` 接受格式字符串和参数,并返回格式化后的字符串。例如,如果命令行输入为 `i=2`,则可以将其格式化为 `awk '{print $%d/1024}'`,表示 `awk` 将打印输入日志文件的第 `i` 行中字段的 1/1024。

问题内容

我正在使用 go 来使用 exec.command 运行 shell 脚本,如下所示,我想使用命令行(例如 i)获取输入参数,并且我的输出应该基于 i,我该怎么做?

i := os.Args[1:2]
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | awk '{print $i/1024}' >> mem_usage.csv").Output()
if err != nil {
    fmt.Println(err.Error())
    return
 }

如何在 shell 脚本中使用 i ?

没有 i 它工作正常,即如果我输入 $1$2 它工作正常,但我希望用户给我 i 的位置,然后进行相应计算。


解决方案


您需要相应地格式化 exec-命令字符串。

所以即:

fmt.sprintf("awk '{print $%d/1024}'", i)

这给出: awk '{print $1/1024}' 对于 i = 1awk '{print $2/1024}' 对于 i = 2

fmt.sprintf 接受格式字符串和要传递到该字符串的参数并返回格式化字符串。 (https://golang.org/pkg/fmt/#Sprintf)

这需要插入到您的 exec 命令中:

i := 2
awkPart := fmt.Sprintf("awk '{print $%d/1024}'", i)
out, err := exec.Command("bash", "-c", "tail -n 1 /var/log/apache2/access.log | "+awkPart+" | tee -a mem_usage.csv").Output()

为了可维护性,您也许应该尝试更多地反汇编命令,但这不是问题的一部分。

以上就是《使用Golang将命令行输入传递给shell脚本执行》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>