Bash Shell脚本的脚本替代


16

我刚刚迁移到UNIX工作站。自从上学以来,我对Bash Shell脚本的记忆就消失了,并且我发现语法非常混乱。我想知道还有哪些其他脚本语言用于自动化任务。我听说过的两个最受欢迎的是Perl和Python。

  1. 现实世界商店中最广泛使用哪种脚本语言?
  2. 哪种脚本语言最类似于C / C ++语法?
  3. 还有我不知道的另一种脚本语言吗?

谢谢你的帮助,

史考特


2
这可能应该是社区Wiki。
EBGreen

2
实际上,我现在将PHP用于大多数系统任务。很快我将给出一个正确的答案。它内置了许多库,非常方便。
凯尔·霍奇森

Shell意图的语言可以做其他语言可能做不到的事情;这是管理并检查所有递归产生的子进程。博客广告Phusion Passenger上详细解释了原因:phusion.github.io/baseimage-docker简而言之,用lang-x编写的脚本可能无法正确处理关闭例程。只要您将它们作为真正的shell进程的子进程运行,那就完全可以了。免责声明,我不是专家。据我所知,此信息可能存在缺陷。
ThorSummoner 2014年

Answers:


12

在某种程度上,这是个人喜好问题。Perl和Python绝对受欢迎。

不过,要回答三个问题中的两个:

  1. 我猜想bash使用最广泛,可能紧随其后的是perl。只是猜测,不知道是否有人进行过调查。:)
  2. 那里有成千上万种脚本语言。:)

我的建议是Python。它易于阅读和编写,功能强大,并且网络上有大量有用的资源可供学习,更不用说可以复制和重新使用的代码了。


1
我同意那个。我发现Python易于学习,并且能够做任何我想做的事情,因为REXX在OS / 2的旧版本中就已经存在了。
斯洛伐克

3
+1 for python ...脚本语言中C的强大功能。您可以根据需要使脚本简单或复杂;)
KFro

1
在非NT系统上,python模块sh可使用python作为外壳脚本语言进行访问;但是,如果遇到极端情况(例如多处理),则必须学习子流程模块,而我到目前为止却发现这很难使用。
雷神召唤师

5

Perl和Python显然是答案。但它们分别用于完成不同的任务:

  1. 重击-掌握最简单的方法。使用Bash脚本,您可以运行命令并操纵输出。
  2. Python-第二个最容易学习的语言。Python比Bash有用得多,因为您可以使用Python编写完整的程序,并且得到社区的大力支持。Python也极易读并且几个月后易于编辑。
  3. Perl-三种语言中最好的一种(用于脚本编写),但学习曲线最陡峭。具有很好的正则表达式支持(这是今天仍在使用的主要原因),随着时间的流逝,您可能会遇到很多Perl脚本。Perl的主要问题是代码的可读性-编写代码几个月后,您将无法确定它的作用。因此,您最好发表评论。
  4. Awk / Sed-两者都很有用,但是两者都很难学。我建议最后解决这些问题,除非您擅长模式。

关于现在要学习哪一个(因为您大概都不知道),我将学习Python。这是最简单,最有用的知识。

至于您的问题的答案:

现实世界商店中最广泛使用哪种脚本语言?

所有这些,但是我想Perl在这里有一点优势(因为它已经在系统管理中使用了更长的时间)。

哪种脚本语言最类似于C / C ++语法?

佩尔

还有我不知道的另一种脚本语言吗?

Ruby,Tcsh / Csh,http://en.wikipedia.org/wiki/Interpreted_language


2
如果您花一些时间在Perl中,则可以编写完全可读的Perl。编写意大利面条式代码的人太快了,不能将Perl的失败归咎于Perl。
Cian

1
我只是基于系统管理员的经验进行发言;我必须维护其他人编写的几乎无法阅读的代码。通常我最终只是用Python重写代码。
Michael Pobega

3

awk适用于小型工作,python适用于多个领域。

Python(如果您不使用特定的API和其他平台相关的东西)具有丰富的“标准库”,该库在使用python版本的所有平台上都可用。这非常好,因为您可以轻松地重用脚本,并且即使您更改平台,这也意味着您的知识是一项很好的投资。

在我们公司中,我们将python用于所有脚本编写,监视,...,并将java用于The Application,在异构环境中我们过得很好。


1

我会说perl和python可能是两个最好的选择。您也可以使用sed和awk做很多事情。


1

Sh(bourne shell),grep,awk和sed始终是一件好事。如果您不需要大量的文本正则表达式,并且可维护性不是那么重要(不是说不可能),那么Perl就是很好的选择。蟒蛇; 如果可读性对您很重要。我的首选是Python,但是所有这些工具都对您投入使用的大多数东西都有好处。您可能想重新考虑c / c ++的语法要求,长期坚持下去对您无济于事。


谢谢马丁。我注意到(从Web上的示例中),Perl与PHP非常相似(尽管从历史上看,我确定它是PHP之前的Perl)。这是一个公平的声明吗?
Scott Davies

PHP 1.0是一个perl脚本,所以不是巧合:)
Bill Weiss

1

如果您想从头开始学习一些东西,最好是(重新)学习bash。

除此之外,perl和python现在很流行。我偏爱perl,但是自Perl 4发布以来,我的perl脚本风格没有太大变化。

我不知道任何“类似于c语法”的脚本语言。


1

如果只是为了获得CPAN的不可思议的资源,Perl会放下手来(http://search.cpan.org/。在如此庞大的社区中使用脚本语言的好处是,您不太可能需要自己发明一些东西。

Perl的好处还在于它可以根据当前情况而变得复杂。您可以将其视为用于快速管理或单一用途脚本的简单脚本语言,但是当您要创建较大的,易于维护的应用程序(如守护程序,服务器,客户端)时,可以使用面向对象的概念或广泛的元对象系统。

仅脚本语言之间的差异还不够严重,不足以挑选明确的赢家,但您应该首先了解一下,您可以轻松找到与自己关心的主题相关的信息。

Perl语法也可以非常接近C,只要您能避免缺少键入和标记即可。随着您最终学习语言的优势,高级的Perl使用将自然而然。

对于可读性方面的反对者:您可以用任何语言编写难以阅读的代码。如果您回顾4个月前的代码而又不明白,那说明您做错了什么。

ps这篇文章中包含指向CPAN上各种易于管理的模块的链接,但是显然新用户只能发布一个链接,因此请使用该CPAN链接来搜索“ CVS”,“ SVN”,“ Cron”和“ Moose”(广泛的对象系统)


1
  • 红宝石
  • 蟒蛇
  • Go是一种跨平台语言,脚本是Go的强项之一
  • Node.js-请参阅Grunt.js,Gulp.js。现在,许多项目都使用Node.js作为外壳自动化工具。
  • 佩尔

1

[有关常规脚本建议,请参阅其他答案]

这个答案是关于命令行程序以及它们的大型链的使用的。

对于正在运行的CLI程序链,或者可能有许多顺序的链,bash是最简单的。Perl 可以做到这一点,但是语言要难学得多,而且要复杂得多,而且正如许多人指出的那样,编写易于理解的Perl很容易。

如果要遍历文件和参数,则bash最容易上手,您可以在shell中进行原型制作,然后复制到脚本中并以最小的开销添加一些数组和循环。

我的意思示例:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

在bash中,很容易将它们包装在其中一些参数的几个循环中。然而,一旦脚本超过几十行,代码就变得难以阅读。-想象30组命令(每行几行),用于三十个不同的数据图-

对于大型脚本,Perl和Python可能更好,因为它们具有更清晰的循环和变量语法,但是bash命令必须作为字符串生成,作为子进程运行,并捕获stdin,stdout。可以做到,但是不能完全替代本机外壳环境。

如果shell的语言更好,那就可以避免。


0
  1. 最常用的:Perl,主要是出于历史原因。Python已在所有Linux和BSD发行版中广泛使用(甚至安装在Mac OSX上),并且学习/编程要好得多。当然,一旦掌握了语法,Bash几乎可以在命令行上完成任何操作。毕竟,它命令行。

    • C语法:有csh,但是您可以轻松安装TCC并将真正的 C用作脚本语言,从源代码编译所需的时间比其他语言的启动要少。

    • 其他脚本语言:很多!LuaRuby,JavaScript ...


0

您应该在适当的地方结合使用所有这些。我真的不喜欢perl(可读性),但是它对很多事情都有好处。另一方面,就系统管理而言,Python对我来说是新事物,直到我不得不管理(但仍然必须)几台KVM机器。在经过一小时的libvirt的python绑定之后,通过脚本启动,停止,保存,加载,迁移所有这些机器成为现实。

最后但并非最不重要的一点是,如果我不得不每晚都从mysql服务器转储所有数据库(每个数据库都在其自己的转储文件中),我将不使用perl或python,将它们压缩并重新同步到其他服务器。为什么呢 因为用bash编写它更快,更容易:)

最后,您应该使用最适合您当前任务的任何语言,并且不要仅仅因为您最喜欢它就使用给定的脚本语言。


0

我喜欢红宝石。它很容易编程。关于使用ruby进行系统管理的书非常出色。

Ruby用于多种配置管理系统(capistrano,chef,puppet)和最新版本的metasploit。

您可以使用rush(用ruby语法替换Unix shell)并执行以下操作:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

谢谢chmeee。我不知道您可以将Ruby用于sysadmin-我一直认为它是以Web为中心的。我正在寻找大多数组织都在使用的东西。可以公平地说,Ruby for sysadmin仍然太前沿了吗?
Scott Davies

1
Shell / Perl是您可以在任何地方都能可靠找到的仅有的两种语言。Python可能是下一个最常见的应用,其中ruby排名第四(实际上,可能落后于awk第五)。
Cian

@ScottDavies PHP和ASP.net是我所知道的仅有的以网络为中心的语言。甚至设计为仅在网络上运行的Javascript也已经成熟,成为表单验证的缺憾。但是,您可以使用任何语言(显然是bash)分发html 。
ThorSummoner 2014年

0

Ruby一线示例:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

我会用红宝石。

与sh相比,它是现代而强大的。

与python相比,它是一致性,一个版本,一个软件包管理器。而且我不喜欢缩进语法。

与Perl相比,它有点老套了,语法对我来说太复杂了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.