问题:Bash等同于Python的pass语句
是否有与Python pass
语句等效的Bash ?
回答 0
您可以:
为此使用。
回答 1
true
是成功执行任何操作的命令。
(false
在某种程度上是相反的:它什么也不做,但是声称发生了故障。)
是否有与Python pass
语句等效的Bash ?
您可以:
为此使用。
true
是成功执行任何操作的命令。
(false
在某种程度上是相反的:它什么也不做,但是声称发生了故障。)
只想知道它们之间的主要区别是什么?以及每种语言的功能(最好使用它)。
编辑:不是“ vs”。就像话题,只是信息。
在出现的顺序,语言是sed
,awk
,perl
,python
。
该sed
程序是一个流编辑器,旨在将脚本中的操作应用于输入文件的每一行(或更一般而言,应用于指定的行范围)。它的语言基于ed
Unix编辑器,尽管它具有条件等,但是很难处理复杂的任务。您可以用它创造一些小奇迹-但要花很多钱。但是,当尝试在其权限范围内执行任务时,它可能是最快的程序。(它具有所讨论程序的功能最弱的正则表达式-足以满足许多目的,但肯定不是PCRE-与Perl兼容的正则表达式)
该awk
程序(以其作者的名字缩写命名-Aho,Weinberger和Kernighan)最初是用于格式化报告的工具。它可以用作汤sed
。在最新版本中,它在计算上是完整的。它使用了一个有趣的想法-该程序基于“模式匹配”和“模式匹配时采取的动作”。这些模式非常强大(扩展正则表达式)。动作的语言类似于C。的主要功能之一awk
是它将输入自动分为记录,每个记录又分为字段。
Perl的部分编写是awk杀手和sed杀手。附带的两个程序是a2p
,s2p
用于将awk
脚本和sed
脚本转换为Perl。Perl是下一代脚本语言中最早的一种(Tcl / Tk可能声称是首要的)。它具有功能强大的集成正则表达式处理功能,并且语言功能强大得多。它提供对几乎所有系统调用的访问,并具有CPAN模块的可扩展性。(既不是可扩展的,awk
也不sed
是可扩展的。)Perl的座右铭之一是“ TMTOWTDI-做到这一点的方法不止一种”(发音为“ tim-toady”)。Perl有“对象”,但它不仅仅是语言的基本组成部分,而是附加组件。
Python是最后编写的,可能部分是对Perl的反应。它具有一些有趣的句法概念(缩进以指示级别-没有大括号或等效项)。从根本上说,它比Perl更面向对象。它与Perl一样可扩展。
OK-什么时候使用每个?
我不知道Perl可以做Python无法做到的任何事情,反之亦然。两者之间的选择将取决于其他因素。我在没有Python之前就学习了Perl,所以我倾向于使用它。Python的语法较少,而且通常更易于学习。Perl 6上市后,将是一个引人入胜的发展。
(请注意,尤其是Perl和Python的“概述”还很不完整;整本书都可以写成该主题。)
掌握了数十种语言后,您会厌倦像S. Lott这样的人(请参阅他对此问题的有争议的答案,在回答六年后,向下投票的比例几乎是向上投票的一半(+ 45 / -22))。
Sed是用于极其简单的命令行管道的最佳工具。在sed管理员的手中,它适合一次性复杂的应用程序,但除非常简单的替换管道外,不应在生产代码中使用。诸如“ s / this / that /”之类的东西。
当只有一个输入源和一个输出(或依次写入的多个输出)时,Gawk(GNU awk)是进行复杂数据重新格式化的最佳选择。由于大量实际工作都符合此描述,并且优秀的程序员可以在两个小时内学习gawk,因此这是最佳选择。在这个星球上,更简单,更快更好!
当您有非常复杂的输入/输出方案时,Perl或Python远远优于任何版本的awk或sed。从维护和可读性的角度来看,问题越复杂,使用python的效果就越好。但是请注意,优秀的程序员可以用任何语言编写可读的代码,而糟糕的程序员可以用任何有用的语言编写无法维护的废话,因此,如果说Perl或python是程序员,则可以放心地选择perl或python熟练而聪明。
我不会将sed称为成熟的编程语言,它是一种流编辑器,具有旨在以编程方式编辑文本文件的语言构造。
Awk只是一种通用语言,但它仍然最适合于文本处理。
Perl和Python是成熟的通用编程语言。Perl扎根于文本处理,并具有许多类似awk的构造(甚至网上都有awk-to-perl脚本浮动)。Perl和Python之间有很多区别,您最好的选择可能是在Wikipedia等上阅读两种语言的摘要,以更好地了解它们的含义。
首先,列表“ Perl,Python awk和sed”中有两个不相关的内容。
事情1-简化的文本操作工具。
sed。它具有固定,相对简单的工作范围,该范围由读取和检查文件的每一行的想法定义。sed并非旨在使其特别可读。它被设计为在非常小的Unix服务器上非常小且非常高效。
w 它的固定性稍差,工作范围也较简单。但是,awk程序的主循环是通过隐式读取源文件的行来定义的。
这些不是“完整的”编程语言。尽管您可以通过一些工作用awk编写相当复杂的程序,但它很快变得复杂且难以阅读。
第2件事-通用编程语言。它们具有丰富的语句类型,大量的内置数据结构,并且没有任何固定的假设或捷径可言。
Perl。
Python。
什么时候使用它们。
sed。决不。在内存超过32K的现代计算机中,它确实没有任何价值。Perl或Python更清楚地执行了相同的操作。
w 决不。像sed一样,它反映了更早的计算时代。与其维护这种语言(除了一个成功的系统所需的所有其他语言),不如简单地用一种令人愉悦的语言来做所有事情。
Perl。任何形式的编程问题。如果您喜欢自由思考的语法,并且有很多很多方法可以执行相同的操作,那么perl很有趣。
Python。任何形式的编程问题。如果您喜欢语法相当有限的语法,那么其中的选择更少,细节更少,并且(也许)更加清晰。Python的面向对象特性使其更适合于大型复杂问题。
背景-我并不是因为无知而抨击sed和awk。我20多年前学过awk。它做了很多事情;曾经将其作为Unix的核心技能来教授。我大约15年前学习了Perl。做了很多复杂的事情。我把两者都抛在后面是因为我可以在Python中做同样的事情-而且更简单,更清晰。
sed和awk有两个严重的问题,都不是年龄。
其实施不完整。sed和awk所做的一切都可以在Python或Perl中完成,通常更简单,有时也更快。Shell管道由于具有多重处理而具有一些性能优势。Python提供了一个subprocess
模块,使我可以恢复这些优势。
需要学习另一种语言。通过使用Python(或Perl)执行操作,您的实现依赖于更少的语言,从而提高了清晰度。
何时使用它们:awk-永远不会-S. Lott。
我认为洛特(S. Lott)对此建议略有遗漏。事实是,在Linux和其他UNIX环境上,awk是与bash,sh和ksh一起用于快速文本处理的有用工具。脚本本身的想法是,您可以通过将该工具(即该工具)粘合在一起来解决问题。因此,在管理脚本中,通常具有ls,grep,|,awk,time,ps等。每个脚本编写器都将其组合为一个工具,就像构建器一砖一瓦地完成建筑(解决当前的问题) 。
例如,我是团队管理的团队成员 彩弹装备互联网。该电子商务网站基于LAMP堆栈。为了自动处理和标准化来自各个供应商的数据馈入后端数据库,我们采用并维护了多种脚本组合,包括bash,perl,php甚至期望。每个模块都有其优势,这取决于可用的模块和API。在bash脚本中,我们使用awk进行模式的快速模式匹配和适当的操作,而无需切换到PERL。我还想指出的一件事是,这些脚本中有相当一部分是从开放源代码中购买或获得的,而在线程中并未强调。如果脚本以Perl的形式出现,则我们将其保留为Perl;如果脚本以Php格式出现,我们将其保持为Php;如果它是bash,我们将其保持为bash;
Ruby示例:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
对我而言,成功的Python字符串连接似乎很冗长。
Python 3.6将添加与Ruby的字符串插值类似的文字字符串插值。从该版本的Python(计划于2016年底发布)开始,您将能够在“ f-strings”中包含表达式,例如
name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
在3.6之前的版本中,最接近的是
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
该%
运算符可用于Python中的字符串插值。第一个操作数是要内插的字符串,第二个操作数可以具有不同的类型,包括“映射”,将字段名称映射到要内插的值。在这里,我使用了局部变量字典locals()
来映射字段名称name
为它的值作为局部变量。
使用.format()
最新Python版本的方法的相同代码如下所示:
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
还有一个string.Template
类:
tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
从Python 2.6.X开始,您可能要使用:
"my {0} string: {1}".format("cool", "Hello there!")
我开发了interpy软件包,该软件包可在Python中启用字符串插值。
只需通过安装即可pip install interpy
。然后,# coding: interpy
在文件开头添加该行!
例:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
Python的字符串插值类似于C的printf()
如果你试试:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
标签%s
将被替换为name
变量。您应该看一下打印功能标签:http : //docs.python.org/library/functions.html
按照PEP 498的规定,Python 3.6将包含字符串插值。您将可以执行以下操作:
name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')
请注意,我讨厌海绵宝宝,所以写这篇文章有点痛苦。:)
你也可以有这个
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)
import inspect
def s(template, **kwargs):
"Usage: s(string, **locals())"
if not kwargs:
frame = inspect.currentframe()
try:
kwargs = frame.f_back.f_locals
finally:
del frame
if not kwargs:
kwargs = globals()
return template.format(**kwargs)
用法:
a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found
PS:性能可能有问题。这对于本地脚本很有用,而不对生产日志有用。
重复的:
对于旧的Python(在2.4上测试),最佳解决方案指明了方向。你可以这样做:
import string
def try_interp():
d = 1
f = 1.1
s = "s"
print string.Template("d: $d f: $f s: $s").substitute(**locals())
try_interp()
你得到
d: 1 f: 1.1 s: s
Python 3.6和更高版本具有使用f字符串的文字字符串插值:
name='world'
print(f"Hello {name}!")