【问题标题】:Read input from command line into the shell script exec using golang使用 golang 将命令行的输入读入 shell 脚本 exec
【发布时间】:2019-05-28 09:19:41
【问题描述】:

我正在使用 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 的位置,然后相应地计算。

【问题讨论】:

    标签: shell go pipe


    【解决方案1】:

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

    也就是说:

    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-command:

    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()
    

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

    【讨论】:

    • 我不明白它是如何工作的,我们必须将第一部分输出通过管道传输到 awk,当我执行您所说的语法错误时,它显示错误:意外的 awk,期待逗号或 ) 可以你请多说一点好吗?无效字符文字(多个字符)@mstruebing
    • 确定i 已设置?
    • 谢谢先生,但它会覆盖文件,因为您删除了脚本中的“>>”?
    • 然后使用tee -a 追加。