2012-04-20 54 views
41

我既爱又恨写Bash。我喜欢它是所以简化操作文件和使用进程(我同意this popular question它在这方面比Python,Ruby等更好),但我讨厌的语法,特别是在条件,循环等是否有任何编译为Bash的语言?

(这是主观的,但我觉得这两个困惑和愤怒如$var读书的时候,但写作时var;在IFS使用正则表达式时,双括号;写入默默地如果周围有=空格失败;双分号有时和单分号等;)

作为CoffeeScript的一个巨大的粉丝,其中c ompiles to JS,我一直在想:是否有任何语言具有像Python/Ruby/CoffeeScript这样的语言的美学/语法,但是它们是作为Bash而不是其他运行时编译和运行的语言?

E.g.我很乐意能写大多-击只是一个有点简单的语法:

$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更好。 =)谢谢!

+3

你考虑过看Perl吗?它具有文件大小,简洁的存在检查('''print'exists'if(-e $ filename);''')并且反向执行。 – tjdett 2012-04-20 02:16:57

+0

我还没有尝试过Perl。在我写这个问题时想到了,但我一直认为Perl也充满了难以理解的语法。 = D我会检查一下 - 谢谢! – 2012-04-20 02:21:12

+2

它可以。幸运的是,您并不需要自己实际使用*。 – 2012-04-20 02:44:27

回答

14

因为我原来问过这个问题,两个项目已经发布了攻击这个问题,并做了很好的工作。两者都在更多编程友好的运行时中重新实现许多/大多数Unix工具。

铅是用Python实现,看起来非常稳固:

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

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

https://github.com/arturadib/shelljs

令人兴奋的发展!我期待着尝试一下。如果你已经有了,在评论中听到你的经验会很棒。谢谢!

5

问题是Bash的整个基于字符串的语义是如此可怕地被破坏,为Bash做类似CoffeeScript的事情是相当困难的。

由于您可能不需要函数级别的互操作性来调用用Bash编写的函数,所以最好使用完全不同的东西。 Perl在讨厌和充满快捷方式和奇怪的语法方面接近Bash,但它的语义大多是健全的。 Python对于诸如启动进程之类的东西不太舒服,但对于一般的系统编程来说更好,干净且易于维护。 Python拥有伟大的库和模块, Perl甚至更好。

+1

我真的不认为Perl是这个人寻找的东西,因为他想在他的脚本中减少“噪音”。 – 2012-09-22 13:05:55

1

你可能想看看进入nscript,在其中您可以使用JavaScript编写shell脚本。所有常见的bash结构是在那里,像退出代码,管道,流重定向,参数扩展,匹配,一种提示等

4

BISH是另一种选择:

https://github.com/tdenniston/bish

外壳脚本用现代的感觉。

Bish是一种轻量级语言,旨在将shell脚本引入21世纪。它为程序员提供了现代语法的舒适性,但是编译为Bash,从而带来了良好的可移植性(就像Bash是便携式一样)。

2

我尝试了所有上述(results),并开始powscript

差异powscript VS以上

工具
  • 极其便携式预处理器(100%的bash)
  • 的CoffeeScript和bash之间平衡
  • hasslefree便携式所有功能于一身的文件编译器/运行时,用bash写的
  • 松散转译:内联bash总是可以的
+0

我实际上使用powscript,真的很喜欢它。我只想说解释者应该更加详细。 – 2016-07-27 22:41:38

0

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

下面是在List类是如何实现的(全例如here)的示例:

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被转换为击4.4关联数组。该语言是第一个版本,开放源代码为Github。随意contirbute和建议功能。

相关问题