groovy shell_如何从Groovy Shell中受益

groovy shell

这是一篇有关Groovy Shell的帖子,以及它如何在日常工作中为您提供帮助(只要您是软件开发人员)。 无论您使用哪种编程语言或技术,都可以从Groovy Shell中受益。 唯一真正的要求是您能够编写(和阅读)小段Groovy代码。

入门

我认为Groovy shell的目的在官方文档中有最好的描述:

Groovy Shell,又名。 groovysh是一个命令行应用程序,可轻松访问以评估Groovy表达式,定义类并运行简单的实验。

Groovy Shell包含在Groovy编程语言的发行版中,可以在<groovy home> / bin中找到。 要启动Groovy Shell,只需从命令行运行groovysh即可:

GROOVY_HOME\bin>groovysh
Groovy Shell (2.2.2, JVM: 1.7.0)
Type 'help' or '\h' for help.
--------------------------------------------------------------------
groovy:000>

现在,您可以在外壳中运行Groovy命令:

groovy:000> println("hu?")
hu?
===> null
groovy:000>

它支持变量和多行语句:

groovy:000> foo = 42
===> 42
groovy:000> baz = {
groovy:001> return 42 * 2
groovy:002> }
===> groovysh_evaluate$_run_closure1@3c661f99
groovy:000> baz(foo)
===> 84
groovy:000>

(请注意,您必须跳过def关键字,以便以后使用变量和闭包)

Windows用户须知

我可以明确地推荐Console(2) ,它是笨拙的cmd窗口的小包装。 它提供了选项卡支持,更好的文本选择和其他有用的功能。

不幸的是,在某些语言环境(包括德语)中,Groovy 2.2.0 Shell在Windows 7/8上的箭头键存在问题 。 但是,可以使用CTRL-P和CTRL-N代替UP和DOWN。 作为替代方案,您可以使用旧的Groovy版本的外壳(Groovy 2.1.9中的groovysh可以正常工作)。

那么,我们可以使用它吗?

我们可以做的最明显的事情是评估Groovy代码。 如果您正在使用Groovy的应用程序上工作,这将特别有用。

也许您知道可以使用<<运算符将元素添加到列表中,但是不确定该运算符是否适用于地图? 在这种情况下,您可以开始谷歌搜索或在文档中查找。 或者,您可以将其键入Groovy Shell并查看其是否有效:

groovy:000> [a:1] << [b:2]
===> {a=1, b=2}

有用!

您不确定是否可以遍历枚举值?

groovy:000> enum Day { Mo, Tu, We }
===> true
groovy:000> Day.each { println it }
Mo
Tu
We
===> class Day

它也可以!

这是一个计算器!

Groovy Shell可用于简单的数学计算:

groovy:000> 40 + 2
===> 42
groovy:000>
groovy:000> 123456789123456789 * 123456789123456789123456789
===> 15241578780673678530864199515622620750190521
groovy:000>
groovy:000> 2 ** 1024
===> 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
groovy:000>

如您所见,Groovy可以很好地处理可能导致其他编程语言溢出的数字。 Groovy使用BigIntegerBigDecimal进行这些计算。 顺便说一句,您可以很快自己验证一下:

groovy:000> (2 ** 1024).getClass()
===> class java.math.BigInteger

请注意,Groovy数学尝试尽可能自然:

groovy:000> 3/2
===> 1.5
groovy:000> 1.1+0.1
===> 1.2

在Java中,这些计算将得出1( 整数除法 )和1.2000000000000002( 浮点算术 )。

多做

也许您需要某个网页的内容? 使用Groovy可以轻松实现:

groovy:000> "http://groovy.codehaus.org".toURL().text
===> <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta name="description" content="Groovy Wiki"/>
    ...

也许出于某些原因,您只想要<meta>标签?

groovy:000> "http://groovy.codehaus.org".toURL().eachLine { if (it.contains('<meta')) println it }
    <meta charset="utf-8"/>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta name="description" content="Groovy Wiki"/>
    <meta name="keywords"
    <meta name="author" content="Codehaus Groovy Community"/>
===> null

我确定您处于需要某些文本的url编码版本的情况:

groovy:000> URLEncoder.encode("foo=bar")
===> foo%3Dbar

当然,您无需记住确切的类和方法名称。 只需输入前几个字符,然后按Tab键即可获得可能的选项:

groovy:000> URL
URL                       URLClassLoader            URLConnection             URLDecoder                URLEncoder
URLStreamHandler          URLStreamHandlerFactory

它也适用于方法:

groovy:000> URLEncoder.e
each(            eachWithIndex(   encode(          every(           every()

自订

要真正受益于Groovy Shell,您应该根据需要对其进行自定义,并提供有助于您日常工作的功能。 为此,您可以将自定义的Groovy代码添加到$ HOME / .groovy / groovysh.profile中(如果文件不存在,请创建该文件)。 groovysh启动时将加载并执行此文件。

假设您要解码一段Base64编码的文本。 一种可行的方法是开始搜索在线Base64解码器。 一种替代方法是在groovysh.profile中添加几行以完成工作:

encodeBase64 = { str ->
  return str.bytes.encodeBase64().toString()
}

decodeBase64 = { str ->
  return new String(str.decodeBase64())
}

现在,您可以使用Groovy Shell中的encodeBase64()和encodeBase64()函数来完成此工作:

groovy:000> encoded = encodeBase64('test')
===> dGVzdA==
groovy:000> decodeBase64(encoded)
===> test

第一次使用时,这种方法可能会慢一些,但是下次您需要对Base64消息进行编码/解码时,您会从中受益。 请注意,自动完成功能也可以在您自己的方法上工作,因此您无需记住确切的名称。

可能不时有用的另一个示例函数是从传递的字符串计算MD5哈希的函数。 我们可以使用Java的MessageDigest类在Groovy中完成此任务:

import java.security.MessageDigest

md5 = { str ->
  // thanks to https://gist.github.com/ikarius/299062
  MessageDigest digest = MessageDigest.getInstance("MD5")
  digest.update(str.bytes)
  return new BigInteger(1, digest.digest()).toString(16).padLeft(32, '0')
}

要计算MD5哈希,我们只需要调用md5()函数即可:

groovy:000> md5('test')
===> 098f6bcd4621d373cade4e832627b4f6

但是,如果我们要计算文件的MD5值怎么办?

如果文件不是那么大,则获取文件的内容就是这样简单:

new File('test.txt').text

我们只需要将此传递给md5()函数即可计算文件的md5哈希值:

groovy:000> md5(new File('test.txt').text)
===> a4ba431c56925ce98ff04fa7d51a89bf

也许您正在处理大量的日期和时间。 在这种情况下,向您的Groovy Shell添加Joda-Time支持可能会很有用。 只需将以下行添加到groovysh.profile:

@Grab('joda-time:joda-time:2.3') import org.joda.time.DateTime
import org.joda.time.DateTime

如果您运行groovysh,则下次将使用Grape下载Joda-Time。 此外,还导入了Joda DateTime类,因此可以在Groovy Console中使用它,而无需添加软件包名称的前缀:

groovy:000> new DateTime().plusDays(42)
===> 2014-04-22T22:27:20.860+02:00

您通常需要将时间值与UNIX时间戳之间进行转换吗?

只需为其添加两个简单功能,您就不再需要在线转换器的书签:

import java.text.SimpleDateFormat
dateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss')

toUnixTimestamp = { str ->
  return dateFormat.parse(str).getTime() / 1000
}

fromUnixTimestamp = { timestamp ->
  return dateFormat.format(new Date(timestamp.toLong() * 1000))
}

在Groovy Shell中的用法:

groovy:000> toUnixTimestamp('2014-04-15 12:30:00')
===> 1397557800
groovy:000> fromUnixTimestamp('1397557800')
===> 2014-04-15 12:30:00

也许您想在远程计算机上执行命令?

您只需要另一个简单的函数即可使用Groovy Shell完成此任务:

ssh = { cmd ->
  def proc = "ssh -i keyfile user@host $cmd".execute()
  proc.waitFor()
  println "return code: ${proc.exitValue()}"
  println "stderr: ${proc.err.text}"
  println "stdout: ${proc.in.text}" 
}

用法:

groovy:000> ssh 'ls -l'
return code: 0
stderr:
stdout: total 1234
-rw-r--r-- 1 foo foo 7678563 Oct 28  2009 file
drwxr-xr-x 4 foo foo    4096 Mar  1 17:07 folder
-rw-r--r-- 1 foo foo      19 Feb 27 22:19 bar
...

如果您不知道:在Groovy中,使用一个或多个参数调用函数时可以跳过括号。 因此ssh'ls -l'与ssh('ls -l')相同。

结论

在切换到Groovy Shell之前,我出于几乎相同的原因使用了Python Shell(即使我根本没有使用Python)。 在过去的一年中,我使用了很多Groovy,很快我发现Groovy Web Console是用于测试和原型制作的非常有价值的工具。 对我来说,Groovy Shell替换了这两个工具。 显然,这是我不想错过的开发工具。

我认为由Groovy Shell提供多少帮助完全取决于您。

翻译自: https://www.javacodegeeks.com/2014/03/how-you-can-benefit-from-groovy-shell.html

groovy shell

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值