我刚刚迁移到UNIX工作站。自从上学以来,我对Bash Shell脚本的记忆就消失了,并且我发现语法非常混乱。我想知道还有哪些其他脚本语言用于自动化任务。我听说过的两个最受欢迎的是Perl和Python。
- 现实世界商店中最广泛使用哪种脚本语言?
- 哪种脚本语言最类似于C / C ++语法?
- 还有我不知道的另一种脚本语言吗?
谢谢你的帮助,
史考特
我刚刚迁移到UNIX工作站。自从上学以来,我对Bash Shell脚本的记忆就消失了,并且我发现语法非常混乱。我想知道还有哪些其他脚本语言用于自动化任务。我听说过的两个最受欢迎的是Perl和Python。
谢谢你的帮助,
史考特
Answers:
在某种程度上,这是个人喜好问题。Perl和Python绝对受欢迎。
不过,要回答三个问题中的两个:
我的建议是Python。它易于阅读和编写,功能强大,并且网络上有大量有用的资源可供学习,更不用说可以复制和重新使用的代码了。
sh
可使用python作为外壳脚本语言进行访问;但是,如果遇到极端情况(例如多处理),则必须学习子流程模块,而我到目前为止却发现这很难使用。
Perl和Python显然是答案。但它们分别用于完成不同的任务:
关于现在要学习哪一个(因为您大概都不知道),我将学习Python。这是最简单,最有用的知识。
至于您的问题的答案:
现实世界商店中最广泛使用哪种脚本语言?
所有这些,但是我想Perl在这里有一点优势(因为它已经在系统管理中使用了更长的时间)。
哪种脚本语言最类似于C / C ++语法?
佩尔
还有我不知道的另一种脚本语言吗?
Ruby,Tcsh / Csh,http://en.wikipedia.org/wiki/Interpreted_language
Sh(bourne shell),grep,awk和sed始终是一件好事。如果您不需要大量的文本正则表达式,并且可维护性不是那么重要(不是说不可能),那么Perl就是很好的选择。蟒蛇; 如果可读性对您很重要。我的首选是Python,但是所有这些工具都对您投入使用的大多数东西都有好处。您可能想重新考虑c / c ++的语法要求,长期坚持下去对您无济于事。
如果您想从头开始学习一些东西,最好是(重新)学习bash。
除此之外,perl和python现在很流行。我偏爱perl,但是自Perl 4发布以来,我的perl脚本风格没有太大变化。
我不知道任何“类似于c语法”的脚本语言。
如果只是为了获得CPAN的不可思议的资源,Perl会放下手来(http://search.cpan.org/。在如此庞大的社区中使用脚本语言的好处是,您不太可能需要自己发明一些东西。
Perl的好处还在于它可以根据当前情况而变得复杂。您可以将其视为用于快速管理或单一用途脚本的简单脚本语言,但是当您要创建较大的,易于维护的应用程序(如守护程序,服务器,客户端)时,可以使用面向对象的概念或广泛的元对象系统。
仅脚本语言之间的差异还不够严重,不足以挑选明确的赢家,但您应该首先了解一下,您可以轻松找到与自己关心的主题相关的信息。
Perl语法也可以非常接近C,只要您能避免缺少键入和标记即可。随着您最终学习语言的优势,高级的Perl使用将自然而然。
对于可读性方面的反对者:您可以用任何语言编写难以阅读的代码。如果您回顾4个月前的代码而又不明白,那说明您做错了什么。
ps这篇文章中包含指向CPAN上各种易于管理的模块的链接,但是显然新用户只能发布一个链接,因此请使用该CPAN链接来搜索“ CVS”,“ SVN”,“ Cron”和“ Moose”(广泛的对象系统)
[有关常规脚本建议,请参阅其他答案]
这个答案是关于命令行程序以及它们的大型链的使用的。
对于正在运行的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的语言更好,那就可以避免。
您应该在适当的地方结合使用所有这些。我真的不喜欢perl(可读性),但是它对很多事情都有好处。另一方面,就系统管理而言,Python对我来说是新事物,直到我不得不管理(但仍然必须)几台KVM机器。在经过一小时的libvirt的python绑定之后,通过脚本启动,停止,保存,加载,迁移所有这些机器成为现实。
最后但并非最不重要的一点是,如果我不得不每晚都从mysql服务器转储所有数据库(每个数据库都在其自己的转储文件中),我将不使用perl或python,将它们压缩并重新同步到其他服务器。为什么呢 因为用bash编写它更快,更容易:)
最后,您应该使用最适合您当前任务的任何语言,并且不要仅仅因为您最喜欢它就使用给定的脚本语言。
我喜欢红宝石。它很容易编程。关于使用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 }