Go语言的使用命令行程序

在Go编程中调用外部命令的几种场景 在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库中, 专门提供了os/exec包来对调用外部程序提供支持, 本文将对调用外部命令的几种使用方法进行总结。 阅读详情

出于如下原因,程序员想创建命令行程序:

1、为创建能够定期自动运行的脚本。

2、为创建与系统中的文件交互的脚本。

3、为创建能够执行系统维护任务的脚本。

4、为避免设计图形用户界面这种无谓的开销。

在Mac os的终端上,输入命令行:

vim beatles.txt

打开vim,输入内容如下:

John
Paul
Ringo
George

保存和退出。

输入命令行如下:

sort beatles.txt

运行结果如下:

George
John
Paul
Ringo

操作输入和输出

操作输入和输出的代码及其含义
名称代码描述
标准输入0包含提供给程序的输入
标准输出1包含显示到屏幕上的输出
标准错误2包含显示到屏幕上的错误消息

输入命令行,删除beatles.txt,如下:

rm beatles.txt

再次输入命令行如下:

sort beatles.txt

运行结果如下:

sort: No such file or directory

访问命令行参数,程序清单如下:

package main

import(
  "fmt"
  "os"
)

func main(){
  for i,arg:=range os.Args{
    fmt.Println("argument",i,"is",arg)
  }
}

有两次输入命令行如下:

go build main.go

./main

运行结果如下:

argument 0 is ./main

输入命令行如下:

./main for bar baz

运行结果如下:

argument 0 is ./main
argument 1 is for
argument 2 is bar
argument 3 is baz

输入命令行如下:

go run main.go

运行结果如下:

argument 0 is /var/folders/3x/txs8lfzs6s13njkkrvjmnz2c0000gn/T/go-build2259276456/b001/exe/main

分析命令行标志,程序清单如下:

package main

import(
  "fmt"
  "flag"
)

func main(){
  s:=flag.String("s","Hello World","String help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
}

有两次输入命令行如下:

go build main.go

./main

运行结果如下:

value of s: Hello World

输入命令行如下:

./main -s Goodbye

运行结果如下:

value of s: Goodbye

输入命令行如下:(-h、--h、-help、--help)

./main -h

运行结果如下:

Usage of ./main:
  -s string
    	String help text (default "Hello World")

指定标志的类型

flag包根据声明分析标志的类型,这对应于Go语言的类型系统。

分析String、Int和Boolean标志,程序清单如下:

package main

import(
  "flag"
  "fmt"
)

func main(){
  s:=flag.String("s","Hello world","String help text")
  i:=flag.Int("i",1,"Int help text")
  b:=flag.Bool("b",false,"Bool help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
  fmt.Println("value of i:",*i)
  fmt.Println("value of b:",*b)
}

两次输入命令行如下:

go build main.go

./main

运行结果如下:

value of s: Hello world
value of i: 1
value of b: false

输入命令行如下:

./main -s Goodbye -i 42 -b

运行结果如下:

value of s: Goodbye
value of i: 42
value of b: true

输入命令行如下:

./main -i String

运行结果如下:

invalid value "String" for flag -i: parse error
Usage of ./main:
  -b	Bool help text
  -i int
    	Int help text (default 1)
  -s string
    	String help text (default "Hello world")

如果用户执行命令行程序时给标志指定的值的类不正确,将显示错误消息。上面的示例中,将标志-i设置成为字符串String。由于必须将这个标志设置为整数值,因此将导致错误:flag包的默认行为是打印错误消息并显示帮助文本。

自定义帮助文本

给命令行工具创建帮助文本,程序清单如下:

package main

import(
  "flag"
  "fmt"
  "os"
)

func main(){
  flag.Usage=func(){
    usageText:=`Usage example [OPTION]
    An example of customizing usage output
    -s,--s    example string argument, default: String help text
    -i,--i    example integer argument, default: Int help text
    -b,--b    example boolean argument, default: Bool help text`
    fmt.Fprintf(os.Stderr,"%s\n",usageText)
  }
  s:=flag.String("s","Hello world","String help text")
  i:=flag.Int("i",1,"Int help text")
  b:=flag.Bool("b",true,"Bool help text")
  flag.Parse()
  fmt.Println("value of s:",*s)
  fmt.Println("value of i:",*i)
  fmt.Println("value of b:",*b)
}

两次输入命令行,如下:也可以指定选项-h。

go build main.go

./main --help

运行结果如下:

Usage example [OPTION]
    An example of customizing usage output
    -s,--s    example string argument, default: String help text
    -i,--i    example integer argument, default: Int help text
    -b,--b    example boolean argument, default: Bool help text

输入命令行“./main”的运行结果如下:

value of s: Hello world
value of i: 1
value of b: true

flag包会自动生成帮助文本。变量Usage设置为一个函数,这样每当在分析标志的过程中发生错误时,都将调用这个函数。

使用标准库中的os包来将消息打印到标准误差(standard Error),因为这条消息将在发现分析错误时显示,但输出是完全可定制的。

创建子命令

很多命令行程序都支持子命令。

要创建子命令并指定标志,如下:

cloneCmd:=flag.NewFlagSet("clone",flag.ExitOnerror)

其中第一个参数为子命令名,而第二个参数则指定了错误处理行为。

flag.ContinueOnError:如果没有分析错误,就继续执行。

flag.ExitOnError:如果有分析错误,就退出并将状态码设置为2 。

flag.PanicOnError:如果发生分析错误,就引发panic。

在命令行程序中使用子命令,程序清单如下:

package main

import(
  "flag"
  "fmt"
  "os"
  "strings"
)
func flagUsage(){
  usageText:=`example is an example cli tool.

Usage:
example command [arguments]
The commands are:
uppercase uppercase a string
lowercase lowercase a string
Use "example [command] --help" for more information about a command.`
  fmt.Fprintf(os.Stderr,"%s\n",usageText)
}
func main(){
  flag.Usage=flagUsage
  uppercaseCmd:=flag.NewFlagSet("uppercase",flag.ExitOnError)
  lowercaseCmd:=flag.NewFlagSet("lowercase",flag.ExitOnError)
  if len(os.Args)==1{
    flag.Usage()
    return
  }
  switch os.Args[1]{
  case "uppercase":
    s:=uppercaseCmd.String("s","","A string of text to be upercased")
    uppercaseCmd.Parse(os.Args[2:])
    fmt.Println(strings.ToUpper(*s))
  case "lowercase":
    s:=lowercaseCmd.String("s","","A string of text to be lowercased")
    lowercaseCmd.Parse(os.Args[2:])
    fmt.Println(strings.ToLower(*s))
  default:
    flag.Usage()
  }
}

输入命令行如下:

./main uppercase -s "i want to grow up"

运行结果如下:

I WANT TO GROW UP

输入命令行如下:

./main lowercase -s "I DO NOT WANT TO GROW UP"

运行结果如下:

i do not want to grow up

POSIX兼容性:省略。

安装和分享命令行程序

要让Go工具发挥作用,必须遵循Go语言约定。必须正确地设置$GOPATH。使用标准的目标布局,并将代码放在一个位于src的子文件夹中。

|——bin

|——pkg

|——src

        |——github.com

子文件夹的路径如下:

$GOPATH/src/github.com/douxiaobo/

Go项目位于这个文件夹中。在这个文件夹中创建一个名为heloworld的文件夹如下:

// Linux / macOS

$ mkdir -p $GOPATH/src/github.com/[your github username]/helloworld

// Windows

$ mkdir "$GOPATH\src\github.com\[your github username]\helloworld"

访问命令行参数,程序清单如下:

package main

import(
	"fmt"
)

func main(){
	fmt.Println("Hurray! You are a Gopher!")
}

使用命令GO install安装这个程序。指定的路径必须是相对于$GOPATH的。

命令行如下:

go install github.com/[your github usrername]/helloworld

将代码提交到Github,让别人能用使用下面的命令轻松地安装它,输入命令行如下:

go get github.com/[your github usrername]/helloworld

go Cobra命令行工具入门 Github:https://github.com/spf13/cobra Star:26.5K Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速的创建命令行工具,特别适合写测试脚本,各种服务的Admin CLI等。 比如 Mattermost 项目,就写了很多 Admin CLI: 我们看一个简单的demo?| 12345678910111213141516171819202122 阅读详情

相关推荐

以太坊源码分析 命令行库 urfave/cli

使用 Go 语言编写命令行程序经常会使用了urfave/cli这个库,比如以太坊软件 geth。在 C 语言中,我们需要根据 argc/argv 解析命令行参数,调用不同的函数,最后还要写一个 usage() 函数用于打印帮助信息。urfave/cli 把这个过程做了一下封装,抽象出 flag/command/subcommand 这些模块,用户只需要提供一些模块的配置,参数的解析和关联在库内部完成,帮助信息也可以自动生成。

dididi 494

Go语言的命令

Go语言包含了丰富的命令行工具,这些工具可以帮助开发者进行编译、运行、测试、格式化、依赖管理等工作。常用的Go语言命令包括go run、go build、go test、go get、go mod、go vet、go fmt、go doc等。每个命令都有其特定的用途和参数,开发者需要掌握这些命令的使用方法,以提高编程效率和质量。学习基础命令:学习Go语言命令需要先掌握一些基础命令,如go run、go build、go test等。可以通过阅读官方文档、参考书籍和在线课程等途径进行学习。

程序员小火龙的知识分享 2388

Go 学习笔记(37)— 标准命令行工具(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get、go vet)

1. 标准命令简述 Go 本身包含来大量用于处理 Go 程序的命令和工具。 命令 作用 build 用于编译指定的代码包或 Go 语言源码文件。命令源码文件会被编译成可执行文件,并存放到命令执行的目录或指定目录下。而库源码文件被编译后,则不会在非临时目录中留下任何文件。 clean 用于清除因执行其他 go 命令而遗留下来的临时目录和文件。 doc 用于显示打印 Go 语言代码包以及程序实体的文档。 env 用于打印 Go 语言相关的环境信息。 fix 用于修正指定代码的

wohu1104的专栏 9798

Go语言执行cmd命令库

Go语言执行cmd命令库

YIYIYI 5649

3、Go语言基础编程示例与实践

本博客详细介绍了Go语言基础编程的多个示例与实践,包括echo命令行参数打印程序、重复行查找工具dup系列、Lissajous动画GIF生成程序以及URL内容获取程序fetch。内容涵盖字符串处理、文件操作、图像生成和网络请求等典型应用场景,通过代码示例与技术点分析,帮助读者掌握Go语言的核心编程技巧和常用标准库使用方法。

e4f5g6h7的博客 71

紫光同创PGL50H开发板PCIE通信保姆级教程:从IP核安装到Windows设备管理器识别

本文详细介绍了紫光同创PGL50H开发板PCIE通信的全流程,从IP核安装到Windows设备管理器识别。通过环境搭建、工程配置、管脚约束、固件烧录等步骤,帮助开发者快速掌握FPGA与PCIE通信技术,解决实际开发中的常见问题,提升开发效率。

weixin_30500473的博客 433

go 程序执行命令

例: 将main.go 和 lib.go 放在gobuild 文件夹下 使用go build 编译。( go build 需要./test1 是因为没安装go install 已安装则不需要)go build 命令用于启动编译,它可以将go语言程序编译成一个可执行文件,只编译不执行。go install 命令是编译并安装源文件,把编译后的文件安装到指定的目录中。用 go install 命令编译并安装可执行文件。go run 命令是将编译和执行合二为一。编译后的文件在临时目录下。

BKN711的博客 1488

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 187

Go语言如何使用命令行程序

介绍在Go语言中如何使用命令行程序

禅与代码的艺术 436

python知网爬虫论文pdf下载+立即可用(动态爬虫)

python实现动态爬虫知网论文,搜索+自动翻页+下载 收集数据利器

Braylon的博客 5379

详解Numpy中的transpose方法

最近在学Numpy碰到了关于数组转置和换轴的概念,尤其是对tanspose方法有些疑惑,尤其是多维,查了不少资料,终于搞懂了。 Numpy数组的轴(axis) 所谓的**轴(axis)**可以理解为数组的维度。 具体而言,二维数组就是有两个维度,如果从空间上看,它就是一个平面,由x轴和y轴构成,而与此相对应的,该二维数组就有两个轴,x轴对应0轴,y轴对应1轴。 同理,三维数组有三个维度,空间上...

BlankGrid的博客 936

Go语言使用cobra开发第一个命令行程序

实现一个简单的命令行程序,能够将输入的单词转换为大写。核心代码都在这个里面。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 741

STM32CubeMX 6.4.0 + STM32F407ZGT6 实战:基于YT8512C PHY的lwIP以太网配置与调试

本文详细介绍了使用STM32CubeMX 6.4.0为STM32F407ZGT6微控制器配置YT8512C PHY芯片,并成功移植lwIP以太网协议栈的实战过程。文章从硬件差异分析入手,逐步讲解时钟配置、ETH外设设置、PHY寄存器适配以及lwIP协议栈剪裁等关键步骤,旨在帮助开发者解决非标准PHY芯片的联网难题,最终实现网络连通与Ping测试。

n8m7b6v5c4的博客 592

让我们开始:使用Golang的命令行程序

总览 Go语言是一种令人兴奋的新语言,它有很好的理由而获得了广泛的欢迎。 在本教程中,您将学习如何使用Go编写命令行程序。 该示例程序称为multi-git,它使您可以同时在多个存储库上执行git命令。 快速入门 Go是一种由C语言和Unix最初的黑客在Google创建的类似于C语言的开源语言,他们是由对C ++的厌恶所激发的。 它显示在Go的设计中,该设计做出了一些非常规的选择,例如避免...

代码教主 1306

硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析

2.通过硬件读写断点的输出信息 可知pc寄存器就是art解释器的取码地址 直接硬件执行断点在这个pc 即可直接trace所有的smali执行流 通杀所有机型系统。本文即将探讨的是 如何在硬件级别实现dalvik bytecode粒度的无痕拦截技术 并实现鼠标点击一键hook 指哪儿打哪儿 感受 button power 的强大魅力!4.由于硬件断点是同步的 断下后可随时硬件dump下这一瞬间的app内存映像 写入unicorn的内存模拟执行。解释器在解释执行前必会读取内存中的bytecode。

2503_90751789的博客 1085

IROS 2025机器人技术解析:从诡异设计到硬核应用

机器人技术正从传统的结构化环境应用,迈向复杂非结构化场景的深度交互。其核心原理在于通过仿生设计、多模态感知与智能控制算法,赋予机器人类似生物的适应性与交互能力。这一技术演进的价值在于突破传统机器人在极端环境、精密操作和自然交互中的瓶颈。例如,结合深度强化学习的全身动力学控制,使机器人能在废墟、管道等复杂地形中自主导航;而软体机器人技术则通过材料变形实现安全、柔顺的抓取操作。这些技术最终服务于极端环境巡检、精密装配和高端陪护等刚性应用场景,推动机器人从功能实现迈向与环境、人进行深度、智能交互的新阶段。

weixin_34006468的博客 449

Go语言学习笔记(十七)

命令行程序也叫命令行使用程序或工具,它被设计在终端运行。本章介绍如何使用Go语言创建命令行程序,您将了解如何分析参数以及如何创建子命令

LiMo-bit的杂货 484

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 330

golang语言cli库/Golang的CLI 命令行程序开发

很多用Go写的命令行程序都用了urfave/cli这个库,包括geth,有必要简单了解一下。用C写过命令行程序的人应该都不陌生,我们需要根据argc/argv一个个地解析命令行参数,调用不同的函数,最后还要写一个usage()函数用于打印帮助信息。urfave/cli把这个过程做了一下封装,抽象出flag/command/subcommand这些模块,用户只需要提供一些模块的配置,参数的解析和关联在库内部完成,帮助信息也可以自动生成。......

SAGGITARXM 2522

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

go run 使用其他函数_Go 每日一库之 cobra

热烈欢迎你,相识是一种缘分,Echa 哥为了你的到来特意准备了一份惊喜,go学习资料《「转」go 语言实战笔记教程系列大纲汇总-值得收藏》简介cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架, 用于生成基于 cobra 的应用程序框架。非常多知名的开源项目使用了 cobra 库构建命令行,如Kubernetes、Hugo、etcd等等等等。 本文介绍 cobra 库...

weixin_39568653的博客 354

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

golang-flag命令行参数的简单介绍

介绍 在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。在 go 标准库中提供了一个包:flag,方便进行命令行解析。 概述 定义flags 标准定义 (1)flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等;并返回一个相应类型的指针。 示例:...

xuan_ting的博客 1708

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【亲测免费】 rclone 安装与配置指南

rclone 安装与配置指南 【免费下载链接】rclone 项目地址: https://gitcode.com/gh_mirrors/rcl/rclone 1. 项目基础介...

gitblog_01297的博客 4271

一个Go和C++多用途工程项目的模型研究

本文探讨一个使用Go语言和C++语言实现的多用途工程项目的模型,该工程可适用于一些实际工作环境,且能提高开发效率,降低维护成本。

李迟的专栏 589

Go语言学习日记【九】监听键盘输入并可通过上下键进行查看历史输入

package main import ( "fmt" "github.com/eiannone/keyboard" ) /* 脚本运行系统:linux 按字母键进行命令输入 回车键换行 上下键查看历史命令 其余键无效 */ func main(){ keysEvents,err := keyboard.GetKeys(10) if err != nil { panic(err) } defer func(){ _ = keyboard.Close() }() fmt..

没枕头我咋睡觉 2175

年度调查 看看 2016 年 Go 语言调查结果

Go 语言官方博客公布了 2016 年 Go 语言使用调查。 在 3,595 名被调查者中,89% 称他们在工作中或工作之外用 Go 编程;63% 称他们的工作是 Web 开发,但只有 9% 的人只从事 Web 开发,一半以上被调查者的工作涉及三个以上领域;63% 的人用 Go 开发命令行程序,60% 写 API 或 RPC 服务,52% 写 Web 服...

weixin_34417814的博客 94

docker python_python程序员教你开发一个我们自己的命令行程序——Docker

前言Cobra是一个强大的用来构建命令行程序的库,许多流行的Go项目都是用它来构建的,比如Kubernetes、Docker、etcd、Istio、Github CLI等等。接下来,演示开发一个我们自己的命令行程序chenqionghe,模仿一下docker命令行,预期功能如下# 查看帮助chenqiong -h # 查看版本,类似docker versionchenqionghe version...

weixin_39907658的博客 205
上一篇: Homebrew安装失败的问题和解决方法
下一篇: 学习如何把代码上传到github(不行,不会做)
DXB2021
博客等级 码龄5年 307粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值