使用Perl可以做什么样的事情,但是使用Bash无法完成?

时间:2010-07-10 12:37:49

标签: perl bash scripting

我是使用脚本语言的新手。我遇到了两种叫做Perl和Bash shell脚本的脚本语言。

我想知道使用Perl脚本可以完成哪些事情但是无法使用Bash shell脚本完成?

感谢。

8 个答案:

答案 0 :(得分:8)

Bash是一个shell,它不是一个完整的编程语言,比如Perl / Python。它没有类似模块或包等的东西。但是,bash shell带有编程工具,如数组,流控制,例如if / else,循环(for,while)等,允许你做简单的脚本。为了使bash shell几乎等同于Python / Perl的强大功能,你应该将它与sed / awk等unix工具一起使用。结合这些,bash脚本/编程可以同样强大。

我不同意海报Phillip关于避免使用Bash的原因,因为使用shell和* nix工具比使用其他语言更好。

总之,你应该尝试学习bash,以及Perl或Python。您对它们的了解将在下次派上用场。

答案 1 :(得分:5)

Perl和Bash有两个不同的目标。 Perl是一种通用语言,bash只是具有一些编程功能的操作系统接口。

答案 2 :(得分:4)

这是tl; dr版本:如果你发现自己写的不仅仅是一页bash,停止并用真正的编程语言重写它。我不在乎它的Perl,Python还是Ruby。只是不要制造不可维护的500线贝壳毛球。

现在,除了现有的答案......

Perl有一个调试器。

很多人不使用Perl调试器,但我非常依赖它。对我来说,弄清楚一个大的shell脚本正在做什么是一场噩梦。我发现这个循环:“在代码周围撒上调试回声,运行,查看调试输出,意识到我需要知道别的东西,再撒上更多的回声,重复一遍”非常缓慢和令人沮丧。在调试器中运行代码可让您根据需要检查数据,并在更好地了解所需内容时执行更多检查。

Perl是跨平台的。

如果没有帮助,bash脚本将无法在Windows上运行,但这并不是我所说的。 Bash依赖于Unix系统附带的命令行程序沙拉......也许吧。假设它们存在,这些并不总是相同。 findgrep之类的内容。它是GNU版本吗? BSD版本?也许是旧的Sun / AIX /版本?它是否支持你投掷的旗帜?

但是,嘿,你只使用Fedora或Debian或其他什么,谁在乎呢?最终要么你的发行版会改变一些不相容的东西,要么你想要转移到一个不同的系统,突然间你发现自己陷入了巨大的混乱。 “为什么那台服务器仍在运行Redhat 7?!”通常是因为它有一些脆弱的shell脚本做一些重要的事情。

这将我们带到......

Perl可以声明其依赖项。

如果Perl程序需要特定版本的Perl和某些模块,它可以通过相对简单的将其作为Perl模块分发的措施以机器可读的方式声明。 Bash没有这样的机制(你可以制作一个dpkg或rpm,这是它自己的地狱)所以你不知道你的bash脚本做了什么样的假设。

Perl易于测试。

我确信它可以分解并测试一个bash程序,而那里有人写了精美的架构shell代码。它喜欢滑雪上坡或跳舞熊。它非常令人印象深刻,但不太实用。所以没有人这样做。 Perl附带了一个测试框架,即使是单个文件程序也很容易测试,并鼓励您将大型程序分解为库。

答案 3 :(得分:1)

基本上,如果我想要做的就是设置并执行程序或运行一系列“内置”命令,如sed,grep或awk,我会使用Bash。如果我不得不做任何计算,数据操作或循环,我会使用perl。我一直在做Bourne shell脚本和perl 20多年。如果我刚刚开始,我会使用Python而不是perl。

答案 4 :(得分:1)

  

我是使用脚本语言的新手。我遇到了两种叫做Perl和Bash shell脚本的脚本语言。

冷却。两者都是有用的技术,两者都可以过度扩展,成为维护和调试的噩梦。

  

我想知道使用Perl脚本可以完成哪些事情但是无法使用Bash shell脚本完成?

两者都是turing complete,因此可以做任何事情。但那不是一个有用的答案:) 两者都有它们的优点,bash(或ksh,csh)通常用于配置脚本或驱动程序脚本。在你的/etc/init.d目录中查找这种风格的脚本列表。一旦你超越了这些类型的脚本,bash往往变得比它的价值更难。

Perl在库等方面功能更强大。它是最大的优势(所以我被告知,我没有做太多perl编程),是文本处理。 (并且我认为它最初设计用于)解析文本文件很方便,这使得系统管理员的生活更轻松。

  

你会建议什么? (你没有问这个,但我假装你做了:))

如果您想学习脚本语言,请了解python。它将是一种更熟悉的语言,它易于学习,而且非常强大。知道了bash和python,我从来没有觉得需要学习perl - 但是对于那些在“程序”中出现的错误的语法混乱感到敬畏。

你会一路上拿起bash,或者读一两个教程,拿起一些书签。你将主要通过命令行中的黑客攻击来学习它,或者将几行.bashrc或其他东西拼凑在一起。不要担心“学习”它。你会随着时间的推移吸收它,然后在你意识到需要的时候偷看它们。

答案 5 :(得分:1)

要在最基本的级别回答,使用perl,您可以访问CPAN,这是(据我所知,无论如何)你无法使用bash。 CPAN包含要执行的任何库,以及您想要使用编程语言执行的任何操作。对于你不能(轻松)使用bash,你用perl做的最常见的事情之一可能就是与数据库连接。

答案 6 :(得分:0)

实际上Bash的灵活性远低于Perl。除了(索引或关联)数组之外,Bash没有算法或数据结构,除了函数之外,没有任何方法可以构造或模块化源代码。此外(并且与其缺乏灵活性相矛盾),Bash非常复杂且不直观,并且很容易引入难以发现的错误。所以我的建议是:尽可能避免Bash,许多其他语言对于通常的编程任务更好。 Perl很好,但是如果你是一个初学者,它可能太复杂和分散注意力 - 总有很多方法可以做某事,你可以选择最好的方法。我推荐使用Python。

如果您想要/必须学习Bash,请准备好大量信息或示例代码是天真的或完全错误的(当给定文件名包含空格时,许多脚本已经中断!)。我对Bash编程的建议是关于Greg Wooledge's wiki的大量文档,例如Bash guideBash FAQBash pitfalls

对于可能的downvoters:我只是在谈论Bash时用作脚本语言,而不是用作交互式shell时,在这种情况下它很好。我不认为Bash糟透了,在这里阅读关于Bash的各种线索,或者阅读众所周知的Bash陷阱:Bash中的大多数问题都源于它无法正确使用数据结构以及依赖外部程序来实现做基本的数据处理。我估计Bash程序员所面临的95%的问题都不会出现在具有合理语法和真实数据结构和算法的语言中。

答案 7 :(得分:0)

如果这是与系统管理员相关的工作,您必须知道这两者。最基本的是shell,因为这是你在unix上用来执行命令的东西。 Perl很重要,因为我发现它更容易用于字符串处理(尽管你也可以在shell中做大部分),你可以使用它来自动化日志报告和检查,还可以快速将几个命令链接在一起。没有shell无法做到,但是现在越来越多的文件采用xml格式(例如),并且更容易在perl中处理,与基于Web的界面等相同。

您还会注意到很多工具都有可用于perl的模块,或者很大一部分可能用perl编写(例如赛门铁克的某些产品)。

关于python,它是一种非常好的语言,并且主要在linux平台上使用很多(很多redhat和ubuntu工具都是用python编写的)。虽然在unix平台上并非如此(solaris,hpux-python默认情况下甚至没有安装在这些平台上),但仍然更倾向于perl。关于你的主要关注点是什么操作系统可能很重要。