golang 如何正确使用双引号?

标签 go

在 Windows cmd 控制台中,当我使用 echo 命令时:

echo abc     //get: abc
echo "abc    //get: "abc 
echo "abc"   //get: "abc"

然后我想用exec包用go语言运行

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd1 := "echo abc def"
    cmd2 := "echo abc\"edf"
    cmd3 := `echo abc"edf`
    cmd4 := `echo abc\"edf`
    cmd5 := "echo abc😊edf你好"
    fo(cmd1)
    fo(cmd2)
    fo(cmd3)
    fo(cmd4)
    fo(cmd5)
}

func fo(command string) {
    cmd := exec.Command("cmd", "/C", command)
    out, _ := cmd.Output()
    fmt.Printf("%s => %s\n", command, string(out))
}

我明白了

echo abc def => abc def
echo abc"edf => abc\"edf
echo abc"edf => abc\"edf
echo abc\"edf => abc\\\"edf
echo abc😊edf你好 => abc??edf����

如您所见,它们(cmd1 除外)都不正确。 utf-8 也没有正确显示。我不希望输出中出现反斜杠(我认为问题实际上是输入而不是输出,见下文)

我不能简单地对结果做一些事情(即从结果中删除反斜杠),因为它不适用于复杂的情况。比如我要运行

cmd /c start "echo abc & echo def"

我不能去掉双引号,否则后面的部分会在当前窗口运行,而不是在开始窗口运行。然后在 go 中,下面的代码不起作用:

cmd6 := "cmd /c start \"echo abc & echo def\""
fo(cmd6)

如何让它在golang中运行?

最佳答案

直接用echo怎么样?

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd1 := "abc def"
    cmd2 := "abc\"edf"
    cmd3 := `abc"edf`
    cmd4 := `abc\"edf`
    cmd5 := "abc😊edf你好"
    cmd6 := "abc & echo def"
    fo(cmd1)
    fo(cmd2)
    fo(cmd3)
    fo(cmd4)
    fo(cmd5)
    fo(cmd6)
}

func fo(command string) {
    cmd := exec.Command("echo", command)
    out, _ := cmd.Output()
    fmt.Printf("%s => %s\n", command, string(out))
}

关于golang 如何正确使用双引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38147961/

相关文章:

go - 将结构从字符串数组更改为深度数组

go - ioutils.WriteFile() 不尊重权限

go - Read 函数完成后,Go rot13Reader 缓冲区未更新

go - if/else 范围内的多个临时变量

concurrency - 这个chan是怎么泄露的?

azure - 在Golang SDK中获取Azure位置列表的问题

go - 定义顶级 Go 模板

每月第一个星期一的 Golang Revel Job 规范

performance - 在 Go 中以 GMP 风格的性能处理大量数据

http - 使用 http 劫持者有什么好处