内容简介:其中第一个参数为可执行文件的名字,其他的参数都是以字符串的形式,存储在slice os.Args当中,可以通过for range 语句来遍历所有的参数上面的参数解析只是从命令行当中把参数存储在os.Args切片当中,应用的时候,不是很方便,特别是,编译好的一个可执行文件,别人不知道如何使用的时候,可以使用Go内置的flag包对参数进行说明,并可设置默认值。flag包依据Type的类型,和参数标志flagName,对标志flagName设置默认值和帮助信息,最终返回一个指向该类型的指针,可以通过指针是否为空来
- Go 执行系统命令
- 命令行参数
- 标准输入输出
Go 执行系统命令
//阻塞式的执行外部 shell 命令的函数,等待执行完毕并返回标准输出 func exec_shell(s string) (string, error){ //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序 //fmt.Println(s) cmd := exec.Command("/bin/bash", "-c", s) //读取io.Writer类型的cmd.Stdout,再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口) var out bytes.Buffer cmd.Stdout = &out //Run执行c包含的命令,并阻塞直到完成。 这里stdout被取出,cmd.Wait()无法正确获取stdin,stdout,stderr,则阻塞在那了 err := cmd.Run() //if err != nil { // fmt.Println(err) //} return out.String(), err } func execCommand(commandName string, params []string) [][]string { //函数返回一个*Cmd,用于使用给出的参数执行name指定的程序 cmd := exec.Command(commandName, params...) //显示运行的命令 fmt.Println(cmd.Args) //StdoutPipe方法返回一个在命令Start后与命令标准输出关联的管道。Wait方法获知命令结束后会关闭这个管道,一般不需要显式的关闭该管道。 stdout, err := cmd.StdoutPipe() var lines [][]string if err != nil { fmt.Println(err) return lines } cmd.Start() //创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的 reader := bufio.NewReader(stdout) //实时循环读取输出流中的一行内容 for { line, err2 := reader.ReadString('\n') if err2 != nil || io.EOF == err2 { break } //fmt.Println(line) lines = append(lines, strings.Split(line, " ")) } fmt.Println(lines[2][3]) //阻塞直到该命令执行完成,该命令必须是被Start方法开始执行的 cmd.Wait() return lines //return true }
Go命令行参数
os.Args
fmt.Println(os.Args)//打印切片内容 for i := 0; i < len(os.Args); i++ { fmt.Println(os.Args[i]) }
其中第一个参数为可执行文件的名字,其他的参数都是以字符串的形式,存储在slice os.Args当中,可以通过for range 语句来遍历所有的参数
package main import ( "fmt" "os" "strconv" ) func main () { for idx, args := range os.Args { fmt.Println("参数" + strconv.Itoa(idx) + ":", args) } }
flag
上面的参数解析只是从命令行当中把参数存储在os.Args切片当中,应用的时候,不是很方便,特别是,编译好的一个可执行文件,别人不知道如何使用的时候,可以使用 Go 内置的flag包对参数进行说明,并可设置默认值。
flag.Type("flagName",defaultValue,"help message") *Type
flag包依据Type的类型,和参数标志flagName,对标志flagName设置默认值和帮助信息,最终返回一个指向该类型的指针,可以通过指针是否为空来判断命令行里是否使用该标志参数,下面是一个例子。
package main import ( "fmt" "flag" ) var n = flag.Int("n", 0, "int类型参数") var b = flag.Bool("b", false, "bool类型参数") var s = flag.String("s", "", "string类型参数") func main() { flag.Parse() fmt.Println("-n:", *n) fmt.Println("-b:", *b) fmt.Println("-s:", *s) fmt.Println("其他参数:", flag.Args()) }
Go 标准输入输出
func main() { input := bufio.NewScanner(os.Stdin)//初始化一个扫表对象 for input.Scan() {//扫描输入内容 line := input.Text()//把输入内容转换为字符串 fmt.Println(line)//输出到标准输出 } }
以上所述就是小编给大家介绍的《Go语言-执行系统命令以及获取命令行参数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- C#命令获取struct offset?
- dotnet 获取指定进程的输入命令行
- go语言 从命令行获取参数解析
- php – 在命令中调用console命令,并在Symfony2中获取输出
- 在命令行内获取公网 IP 的几种简单方法
- 如何创建Perl脚本以获取一些“命名”命令行参数?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UML基础与Rose建模案例
吴建 / 人民邮电出版社 / 2004-10 / 29.00元
《UML 基础与Rose建模案例》介绍了用UML(统一建模语言)进行软件建模的基础知识以及Rational Rose工具的使用方法,其中,前8章是基础部分,对软件工程思想、UML的相关概念、Rational Rose工具以及RUP软件过程等进行了详细的介绍;后3章是案例部分,通过3个综合实例,对UML建模(以Rose为实现工具)的全过程进行了剖析;最后的附录中给出了UML中常用的术语、标准元素和元......一起来看看 《UML基础与Rose建模案例》 这本书的介绍吧!