67

我既喜欢又讨厌写 Bash。我喜欢它在操作文件和处理进程方面如此精简(我同意这个流行的问题,在这方面它比 Python、Ruby 等要好得多),但我讨厌这种语法,尤其是在条件、循环等方面.

(这是主观的,但我觉得它既令人困惑又烦人。例如$var,在阅读时,但var在写作时;如果 周围有空格,则写入静默失败=;使用正则表达式时 ifs 中的双括号;有时使用双分号,其他使用单分号;等等。 )

作为可编译为 JS 的 CoffeeScript 的忠实粉丝,我一直在想:是否有任何语言具有 Python/Ruby/CoffeeScript 等语言的美学/语法,但可以作为 Bash 而不是其他运行时之一编译和运行?

例如,我希望能够用更简单的语法编写大部分 Bash:

$AGGREGATE_FILENAME = 'allfiles.txt'

if not exists $AGGREGATE_FILENAME
    touch $AGGREGATE_FILENAME

for $file in files/*
    cat $file >> $AGGREGATE_FILENAME

switch $1
    case 'test'
        run-tests
        echo 'Tests finished!'
    case 'deploy'
        echo 'Packaging...'
        mv foo bar/
        deploy-bar

这是一个超级人为的例子,语法是一个稻草人(主要受 CoffeeScript 启发,但保留了一流命令的基本 Bash 概念,与变量分离,以及松散的类型)。

无论如何,只是一个问题和思考的食物。我希望能够用比 Bash 更好的方式编写脚本。=) 谢谢!

4

8 回答 8

20

您还可以尝试 Batsh,它是一种 DSL(域特定语言),可将 C 语法语言编译为 Bash(和 Windows Batch)。

于 2013-10-29T17:04:34.970 回答
15

自从我最初提出这个问题以来,已经发布了两个项目来解决这个问题并且做得很好。两者都在对编程更友好的运行时中重新实现了许多/大多数 Unix 工具。

Plumbum 是用 Python 实现的,看起来很可靠:

http://plumbum.readthedocs.org/en/latest/index.html

ShellJS 是在 Node.js 上实现的,看起来也不错:

https://github.com/arturadib/shelljs

令人兴奋的发展!我期待着尝试一下。如果您已经拥有,很高兴在评论中听到您的经历。谢谢!

于 2012-10-09T17:39:00.917 回答
9

我尝试了上述所有方法(结果)并启动了powscript

差异powscript与上述工具

  • 极其便携的预处理器(100% bash)
  • coffeescript 和 bash 之间的平衡
  • 无忧的便携式多合一文件编译器/运行时,用 bash 编写
  • 松散的转译器:内联 bash 总是可能的
于 2016-02-21T00:35:05.453 回答
7

比什是另一种选择:

https://github.com/tdenniston/bish

具有现代感的 Shell 脚本。

Bish 是一种轻量级语言,旨在将 shell 脚本带入 21 世纪。它为程序员提供了现代语法的舒适性,但可以编译为 Bash,从而具有良好的可移植性(尽管 Bash 是可移植的)。

于 2015-09-11T18:45:56.627 回答
5

问题是 Bash 的整个基于字符串的语义被严重破坏,很难为 Bash 做类似 CoffeeScript 之类的事情。

由于您可能不需要函数级互操作性来调用用 Bash 编写的函数,因此最好使用完全不同的东西。Perl 与 Bash 很接近,因为它令人讨厌,并且充满了快捷方式和奇怪的语法,但它的语义大多是合理的。Python 对于诸如启动进程之类的事情不太舒服,但对于一般系统编程来说要好得多,干净且易于维护。Python 有很棒的库和模块。Perl 甚至更好。

于 2012-06-06T12:08:45.230 回答
3

我最近开发了一种名为BashClass的语言,它是面向对象的,具有类型检查功能并允许多维数组。语言语法受到不同编程语言的启发。

这是一个关于如何实现类的示例(此处List为完整示例):

class List extends Object {
    var Object[] data = new Object[];
    var int size = 0;
    constructor List(){
        super_constructor();
    }

    function void add(var Object object) {
        data[size] = object;
        size = size + 1;
    }

    function void pop() {
        if(size == 0) {
            exception("Cannot remove element from an empty list");
        }
        size = size - 1;
        data[size] = null;
    }

    function int size() {
        return size;
    }

    function Object get(var int index) {
        if(index < 0 || index >= size) {
            exception("Cannot access element out of bound");
        }
        return data[index];
    }
}

BashClass 中的类和多维数组被转换为 Bash 4.4 关联数组。该语言是第一个版本,在Github上是开源的。随意贡献和建议功能。

于 2017-11-20T15:25:24.647 回答
2

您可能想尝试一下 ZSh,它有很多改进可以使您的 shell 脚本更具可读性。

http://www.zsh.org

于 2012-09-12T12:24:24.030 回答
1

您可能想看看nscript,您可以在其中使用 javascript 编写 shell 脚本。所有常见的 bash 结构都在其中,例如退出代码、管道、流重定向、参数扩展、通配符、提示符等。

于 2015-01-27T19:54:57.380 回答