189 8069 5689

如何用go语言运行脚本,go调用shell脚本

Go语言命令行利器cobra使用教程

cobra是一个提供简单接口来创建强大的现代CLI界面的库类似git git tools,cobra也是一个应用程序,它会生成你的应用程序的脚手架来快速开发基于cobra的应用程序

成都创新互联专注于且末企业网站建设,响应式网站设计,电子商务商城网站建设。且末网站建设公司,为且末等地区提供建站服务。全流程按需网站制作,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务

cobra提供:

cobra建立在命令、参数、标志的结构之上

commands代表动作,args是事物,flags是动作的修饰符

最好的应用程序在使用时读起来就像句子,因此,用户直观地知道如何与它们交互

模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 动词 名词 形容词 或者 APPNAME 命令 参数 标志)

一些真实世界的好例子可以更好地说明这一点

kubectl 命令更能体现APPNAME 动词 名词 形容词

如下的例子,server 是command,port是flag

这个命令中,我们告诉git 克隆url

命令是应用程序的中心点,应用程序支持的每一个交互都包含在一个命令中,命令可以有子命令,也可以运行操作

在上面的例子中,server是命令

更多关于cobra.Command

flag是一种修改命令行为的方式,cobra支持完全兼容POSIX标志,也支持go flag package,cobra可以定义到子命令上的标志,也可以仅对该命令可用的标志

在上面的命令中,port是标志

标志的功能由 pflag library 提供,pflag library是flag标准库的一个分支,在添加POSIX兼容性的同时维护相同的接口。

使用cobra很简单,首先,使用go get按照最新版本的库,这个命令会安装cobra可执行程序以及库和依赖项

下一步,引入cobra到应用程序中

虽然欢迎您提供自己的组织,但通常基于Cobra的应用程序将遵循以下组织结构:

在Cobra应用程序中,main.go文件通常非常简单。它有一个目的:初始化Cobra。

使用cobra生成器

cobra提供了程序用来创建你的应用程序然后添加你想添加的命令,这是将cobra引入应用程序最简单的方式

这儿 你可以发现关于cobra的更多信息

要手动实现cobra,需要创建一个main.go 和rootCmd文件,可以根据需要提供其他命令

Cobra不需要任何特殊的构造器。只需创建命令。

理想情况下,您可以将其放在app/cmd/root.go中:

在init()函数中定义标志和处理配置

例子如下,cmd/root.go:

创建main.go

使用root命令,您需要让主函数执行它。为清楚起见,Execute应该在根目录下运行,尽管它可以在任何命令上调用。

在Cobra应用程序中,main.go文件通常非常简单。它有一个目的:初始化Cobra。

可以定义其他命令,通常每个命令在cmd/目录中都有自己的文件。

如果要创建版本命令,可以创建cmd/version.go并用以下内容填充它:

如果希望将错误返回给命令的调用者,可以使用RunE。

然后可以在execute函数调用中捕获错误。

标志提供修饰符来控制操作命令的操作方式。

由于标志是在不同的位置定义和使用的,因此我们需要在外部定义一个具有正确作用域的变量来分配要使用的标志。

有两种不同的方法来分配标志。

标志可以是“持久”的,这意味着该标志将可用于分配给它的命令以及该命令下的每个命令。对于全局标志,在根上指定一个标志作为持久标志。

也可以在本地分配一个标志,该标志只应用于该特定命令。

默认情况下,Cobra只解析目标命令上的本地标志,而忽略父命令上的任何本地标志。通过启用Command.TraverseChildren,Cobra将在执行目标命令之前解析每个命令上的本地标志。

使用viper绑定标志

在本例中,持久标志author与viper绑定。注意:当用户未提供--author标志时,变量author将不会设置为config中的值。

更多关于 viper的文档

Flags默认是可选的,如果希望命令在未设置标志时报告错误,请根据需要进行标记:

持久性Flags

可以使用命令的Args字段指定位置参数的验证。

内置了以下验证器:

在下面的示例中,我们定义了三个命令。两个是顶级命令,一个(cmdTimes)是顶级命令之一的子命令。在这种情况下,根是不可执行的,这意味着需要一个子命令。这是通过不为“rootCmd”提供“Run”来实现的。

我们只为一个命令定义了一个标志。

有关标志的更多文档,请访问

对于一个更完整的例子更大的应用程序,请检查 Hugo 。

当您有子命令时,Cobra会自动将help命令添加到应用程序中。当用户运行“应用程序帮助”时,将调用此函数。此外,help还支持所有其他命令作为输入。例如,您有一个名为“create”的命令,没有任何附加配置;调用“app help create”时,Cobra将起作用。每个命令都会自动添加“-help”标志。

以下输出由Cobra自动生成。除了命令和标志定义之外,不需要任何东西。

帮助就像其他命令一样。它周围没有特殊的逻辑或行为。事实上,你可以提供你想提供的。

您可以为默认命令提供自己的帮助命令或模板,以用于以下功能:

当用户提供无效的标志或无效的命令时,Cobra通过向用户显示“用法”来响应。

你可以从上面的帮助中认识到这一点。这是因为默认帮助将用法作为其输出的一部分嵌入。

您可以提供自己的使用函数或模板供Cobra使用。与帮助一样,函数和模板也可以通过公共方法重写:

如果在root命令上设置了version字段,Cobra会添加一个顶级的'--version'标志。运行带有“-version”标志的应用程序将使用版本模板将版本打印到标准输出。可以使用cmd.SetVersionTemplate(s string)函数自定义模板。

可以在命令的主运行函数之前或之后运行函数。PersistentPreRun和PreRun函数将在运行之前执行。PersistentPostRun和PostRun将在运行后执行。如果子函数不声明自己的函数,则它们将继承Persistent*Run函数。这些函数按以下顺序运行:

输出:

当发生“未知命令”错误时,Cobra将打印自动建议。这使得Cobra在发生拼写错误时的行为类似于git命令。例如:

基于注册的每个子命令和Levenshtein距离的实现,建议是自动的。匹配最小距离2(忽略大小写)的每个已注册命令都将显示为建议。

如果需要在命令中禁用建议或调整字符串距离,请使用:

or

您还可以使用SuggestFor属性显式设置将为其建议给定命令的名称。这允许对在字符串距离方面不接近的字符串提供建议,但在您的一组命令中是有意义的,并且对于某些您不需要别名的字符串。例子:

Cobra可以基于子命令、标志等生成文档。请在 docs generation文档 中阅读更多关于它的信息。

Cobra可以为以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,这些补全功能将非常强大和灵活。在 Shell Completions 中阅读更多关于它的信息。

Cobra is released under the Apache 2.0 license. See LICENSE.txt

GO语言(三十):访问关系型数据库(上)

本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。

您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。

在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。

首先,为您要编写的代码创建一个文件夹。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。

3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。

运行go mod init命令,为其提供新代码的模块路径。

此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。

注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。

GO语言(二十五):管理依赖项(上)

GO语言(二十六):管理依赖项(中)

GO语言(二十七):管理依赖项(下)

接下来,您将创建一个数据库。

在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。

您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。

这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。

1、打开一个新的命令提示符。

在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,创建一个数据库。

3、切到您刚刚创建的数据库,以便您可以添加表。

4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。

将以下 SQL 代码粘贴到文件中,然后保存文件。

在此 SQL 代码中:

(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。

(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。

(3)添加带有值的四行。

5、在mysql命令提示符下,运行您刚刚创建的脚本。

您将使用以下形式的source命令:

6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。

接下来,您将编写一些 Go 代码进行连接,以便进行查询。

现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。

找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。

1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。

2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。

3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.

4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。

5、进入main.go,粘贴以下代码导入驱动包。

在此代码中:

(1)将您的代码添加到main包中,以便您可以独立执行它。

(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。

导入驱动程序后,您将开始编写代码以访问数据库。

现在编写一些 Go 代码,让您使用数据库句柄访问数据库。

您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。

编写代码

1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。

在此代码中:

(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。

该Config结构使代码比连接字符串更容易阅读。

(4)调用sql.Open 初始化db变量,传递 FormatDSN。

(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。

为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。

(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。

(7)检查来自Ping的错误,以防连接失败。

(8)Ping如果连接成功,则打印一条消息。

文件的顶部现在应该如下所示:

3、保存 main.go。

1、开始跟踪 MySQL 驱动程序模块作为依赖项。

使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。

2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。

连接成功了!

接下来,您将查询一些数据。

如何使用go语言来运行PHP

Apache / Nginx 好好的为什么要用 Go 重写?

你要达到什么目的?

如果网站的主要部分还是 PHP,其中 PHP 脚本需要用到某些其它功能,听起来应该是:要么写个服务(HTTP / Thrift / ...)从 PHP 里调用,要么写个 PHP 扩展提供几个模块函数接口给 PHP 脚本直接调用。第一个效率较低但是实现方便灵活性高,Golang 确定没问题;第二个调用效率较高,实现较难,不确定 Golang 可以做到。

go语言怎么调用shell脚本文件

一、Android应用启动服务执行脚本1如何写服务和脚本在android源码根目录下有/device/tegatech/tegav2/init.rc文件相信大家对这个文件都不陌生(如果不明白就仔细研读下android启动流程)。如果在该脚本文件中添加诸如以下服务:serviceusblp_tes...

求用go语言编写的统计脚本

package main

import (

"fmt"

"os"

)

func main() {

if len(os.Args) 2 {

fmt.Println("Please Input File Name!")

return

}

file, err := os.Open(os.Args[1])

if err != nil {

return

}

buff := make([]byte, 1000)

_, err = file.Read(buff)

if err != nil {

return

}

a, c, d, e, _ := Sum(buff)

fmt.Printf("a c d e \n%d %d %d %d\n", a, c, d, e)

}

func Sum(buff []byte) (a, c, d, e, def int) {

for i := 0; i len(buff); i++ {

switch buff[i] {

case 'a':

a++

case 'c':

c++

case 'd':

d++

case 'e':

e++

default:

def++

}

}

return

}

如何使用Go语言实现远程执行命令

一般命令

所谓一般命令,就是在一定时间内会执行完的命令。比如 grep, cat 等等。 执行命令的步骤是:连接,执行,获取结果

连接

连接包含了认证,可以使用 password 或者 sshkey 2种方式来认证。下面的示例为了简单,使用了密码认证的方式来完成连接。

import (

"fmt"

"time"

"golang.org/x/crypto/ssh"

)

func connect(user, password, host string, port int) (*ssh.Session, error) {

var (

auth []ssh.AuthMethod

addr string

clientConfig *ssh.ClientConfig

client *ssh.Client

session *ssh.Session

err error

)

// get auth method

auth = make([]ssh.AuthMethod, 0)

auth = append(auth, ssh.Password(password))

clientConfig = ssh.ClientConfig{

User: user,

Auth: auth,

Timeout: 30 * time.Second,

}

// connet to ssh

addr = fmt.Sprintf("%s:%d", host, port)

if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {

return nil, err

}

// create session

if session, err = client.NewSession(); err != nil {

return nil, err

}

return session, nil

}

连接的方法很简单,只要提供登录主机的 用户*, *密码*, *主机名或者IP*, *SSH端口

执行,命令获取结果

连接成功后,执行命令很简单

import (

"fmt"

"log"

"os"

"time"

"golang.org/x/crypto/ssh"

)

func main() {

session, err := connect("root", "xxxxx", "127.0.0.1", 22)

if err != nil {

log.Fatal(err)

}

defer session.Close()

session.Run("ls /; ls /abc")

}

上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果。 要想显示结果,需要将 session 的 Stdout 和 Stderr 重定向 修改 func main 为如下:

func main() {

session, err := connect("root", "xxxxx", "127.0.0.1", 22)

if err != nil {

log.Fatal(err)

}

defer session.Close()

session.Stdout = os.Stdout

session.Stderr = os.Stderr

session.Run("ls /; ls /abc")

}

这样就能在屏幕上显示正常,异常的信息了。

交互式命令

上面的方式无法远程执行交互式命令,比如 top , 远程编辑一个文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要当前的terminal来接管远程的 PTY。

func main() {

session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)

if err != nil {

log.Fatal(err)

}

defer session.Close()

fd := int(os.Stdin.Fd())

oldState, err := terminal.MakeRaw(fd)

if err != nil {

panic(err)

}

defer terminal.Restore(fd, oldState)

// excute command

session.Stdout = os.Stdout

session.Stderr = os.Stderr

session.Stdin = os.Stdin

termWidth, termHeight, err := terminal.GetSize(fd)

if err != nil {

panic(err)

}

// Set up terminal modes

modes := ssh.TerminalModes{

ssh.ECHO: 1, // enable echoing

ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud

ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud

}

// Request pseudo terminal

if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {

log.Fatal(err)

}

session.Run("top")

}


分享标题:如何用go语言运行脚本,go调用shell脚本
文章URL:http://cdxtjz.cn/article/hsgesj.html

其他资讯