在go中使用curl和命令

时间:2018-11-01 11:31:57

标签: linux go curl

我正在使用Go with命令执行curl,它按预期工作

curl := exec.Command("curl", "https://services.odata.org/V3/northwind/northwind.svc/")
    out, err := curl.Output()
    if err != nil {
        fmt.Println("erorr" , err)
        return
    }
    fmt.Println(out)

现在我要使用一些占位符,例如

curl -O http://quiet-waters-1228.herokuapp.com/assets/image.jpg

但是现在我需要获取命令的URL 例如如果我以bash mytool url运行,我将获得url值

`curl -O $(mytool url)`

问题是我们需要在代码中执行命令,但我不确定如何传递它

curl := exec.Command("curl", "curl -O $(url)")
        out, err := curl.Output()
        if err != nil {
            fmt.Println("erorr" , err)
            return
        }
        fmt.Println(out)

1 个答案:

答案 0 :(得分:3)

os包中,您有一部分字符串,其中包含shell传递给程序的所有参数。

os.Args的第0个值,即第一个元素将成为命令本身的名称。

如果您的工具命令是mytool,则os.Args[0]包含mytool

其余部分将作为参数,由shell传递。

package main

import (
    "log"
    "os"
    "os/exec"
)

func main() {

    if len(os.Args) < 2 {
        // If argument is not provided quit
        log.Fatalln("url not provided")
    }
    url := os.Args[1] // URL

    cmd := exec.Command("curl", "-O", url)
    cmd.Run()
}

您还可以同时下载多个URL,

var wg *sync.WaitGroup

func main() {
    urls := os.Args[1:]

    wg = new(sync.WaitGroup)
    wg.Add(len(urls))

    for _, url := range urls {
        go download(url)
    }

    wg.Wait()
}

func download(url string) {
    defer wg.Done()
    cmd := exec.Command("curl", "-O", url)
    cmd.Run()
}