【问题标题】:A better BASH? - BASH and "maddening" syntax [closed]更好的 BASH? - BASH 和“令人抓狂”的语法 [关闭]
【发布时间】:2015-04-22 17:05:49
【问题描述】:

更好的 BASH?

我对 BASH 非常缺乏经验,但最近我一直在使用它来执行我的程序代码,以便对实验室中的各种实验的数据进行批处理。

我已经使用 C/C++ 好几年了,所以我认为自己是“相当称职”的程序员。

...在 bash 方面并非如此...

我意识到 BASH(或至少 SH 或其前身)可能从 1971 年就已经存在,因此非常古老,因此可能有 10^6 + 1 个原因说明语法是这样的(向后兼容性是其中之一),但是,今天我尝试这样做:

for DEPTH in {$START..$END}
do
    ...
done

这不起作用,因为在这种情况下,{$START..$END} 的计算结果为 {9..9}(字符串,而不是扩展 '9')...

为了解决这个问题,我必须执行以下操作:

for DEPTH in $(eval echo "{$START..$END}")
do
    ...
done

这……呃……很奇怪。比 Matlab 偶尔毛茸茸的语法更重要。 (我不认为这是一个太有争议的声明,我的假设是任何使用像 Fortran、C 或 Python(或任何其他)这样的语法一致语言的人都可能同意这真的不是很好。除此之外否则,要完成这么简单的任务,需要输入 (IMO) 太多了。

我知道 BASH 现在支持类似 C 的语法:

for (( c=$START; c<=$END; c++ ))

但这并没有好很多...主要是因为我们有一些奇怪而神秘的双括号,现在我们使用像 &lt;=++ 这样的东西不能在其他任何地方使用(在 BASH 脚本中) 据我所知。

还有一些其他的东西让我很困惑,比如== 用于字符串比较,但-eq 用于数字比较。 (同样,与上述评论相关。)这里发生了什么?

所以我的问题是,有没有一个“更好的 BASH”在语法上更“抛光”?为什么 BASH 会坚持这种疯狂的做事方式?那 10^ + 1 个原因是什么?

我知道 tcsh/csh,但我不认为foreach n ( 1 2 3 4 5 ) 有很大改进,所以我一直在使用 BASH,因为至少它被广泛使用,所以当我遇到这些“语法”时,我可以轻松获得帮助坑洼”。

【问题讨论】:

  • {a..b} 问题来自 Bash 试图包含来自 csh 的功能。 :(
  • 如果你觉得 bash 语法笨拙(我不一定不同意你的观点),我想你会发现 csh/tcsh 更糟糕。它使一些简单的事情变得简单,但总体而言,它的语法远没有那么连贯。必填链接:perl.com/doc/FMTEYEWTK/versus/csh.whynot
  • zsh 人们喜欢 zsh 的原因之一和至少一些 bash 人(包括我自己)喜欢 bash 的原因是一样的:当旧的行为很愚蠢时,zsh 会破坏向后兼容性。我的阵营认为有时候为了兼容性而做一些愚蠢的事情是值得的,但它肯定不是一刀切。
  • 顺便说一句——字符串比较应该是=,而不是==,如果你想养成与POSIX兼容的习惯; == 是一个 bash 扩展。
  • Bash 和 C/C++ 使用不同的范例,所以这有点像问为什么 Haskell/Prolog 疯狂地不允许你增加变量。 Bash 的评估模型实际上更像是一个递归的单通道宏处理器。

标签: linux bash syntax


【解决方案1】:

首先,“奇怪的双括号”是您告诉 bash 您想要进行算术运算的方式。它们是let 的同义词,可让您避免引用所有内容。如果你不使用((..))let,那么一切都只是字符串。

但是您可以在其他地方使用((...)),而不仅仅是for 循环。您可以使用$((...)) 包含算术表达式的结果,或者使用((...))(例如(( x = y/2 + 3 )) 或进行比较(例如if (( y%2 == 0 ))),等等。

请注意,在算术上下文中,您不必在变量上加上美元符号 - 它们会自动替换为它们的数值。

通过{...} 进行的花括号扩展是与核心 POSIX 语义没有很好集成的黑客事件,就像用 ! 进行的历史替换一样。特别是,大括号扩展发生在任何其他替换之前。所以给定{$foo..$bar},花括号扩展器将$foo$bar 视为文字字符串,而不是数字,因此它们不会触发范围扩展。当 bash 将 $foo 扩展到它的值时,花括号做任何事情都为时已晚。

还有很多其他语言你可能会认为它们比 bash 更适用于命令行脚本;这就是 Perl 被发明的全部原因。现在,在大多数具有 bash 的系统上,您都可以轻松掌握 Python 和 Ruby。 bash 的主要优势仍然是“API”与“UI”相同……您不必将 shell 命令转换为库或 API 调用。但如果你正在做任何非常复杂的事情,你最好切换语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2012-06-17
    相关资源
    最近更新 更多