如何在 Golang 函数中使用 bash 脚本的输出

how to use the output of a bash script in a Golang function

这甚至可能是不可能的,但过去一个小时我一直在研究,但一无所获。我有一个 bash 脚本,它给我特定的输出,我想将该输出添加到 Golang,以便根据 bash 脚本的输出重定向网站。抱歉,如果这没有意义,我是 Go 的新手

这是我必须 运行 bash 脚本并输出值

 func main() {
    out, err := exec.Command("/bin/sh", "script.sh").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf(string(out))
}

然后我想在另一个函数中使用那里输出的值并重定向 URL 这是我将如何重定向到 url 我希望 $variable 到被添加。这只是我从互联网上复制的一个示例,但它是我想要复制的。

func redirect(w http.ResponseWriter, r *http.Request) {

    http.Redirect(w, r, "**$variable**", 301)
}
 func main() {
     http.HandleFunc("/", redirect)
     err := http.ListenAndServe(":8080", nil)
     if err != nil {
         log.Fatal("ListenAndServe: ", err)
     }
 }

假设您的脚本在启动时必须只 运行 一次,那么这应该可以解决问题:

var redirectTo string

func redirect(w http.ResponseWriter, r *http.Request) {
    http.Redirect(w, r, redirectTo, 301)
}

func main() {
    out, err := exec.Command("/bin/sh", "script.sh").Output()
    if err != nil {
       log.Fatal(err)
    }
    redirectTo = string(out)
    http.HandleFunc("/", redirect)
    err = http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

或者如果您不想拥有全局变量,您可以在 运行 时间生成重定向函数:

func main() {
    out, err := exec.Command("/bin/sh", "script.sh").Output()
    if err != nil {
       log.Fatal(err)
    }
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        http.Redirect(w, r, string(out), 301)
    })
    err = http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

如果你想在out为空时进行处理,你可以这样做:

func redirect(w http.ResponseWriter, r *http.Request) {
    if len(redirectTo) == 0 {
        http.Error(w, "No URL parsed!", 500)
        return
    }
    http.Redirect(w, r, redirectTo, 301)
}

在这种情况下,这将 return HTTP 错误 500。

您也可以直接退出程序而不是服务:

out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
   log.Fatal(err)
}
if len(out) == 0 {
   log.Fatal("no output was returned from script")
}

如果您愿意,您还可以在此处向 out 添加更多验证,例如它是否正确 URL,使用 net/url 包。