【发布时间】:2012-05-01 15:01:46
【问题描述】:
我既喜欢又讨厌写 Bash。我喜欢它如此简化了操作文件和处理进程(我同意this popular question,在这方面它比 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 更好的方式编写我的脚本。 =) 谢谢!
【问题讨论】:
-
你考虑过 Perl 吗?它具有文件 glob、简洁的存在检查 (
print 'exists' if (-e $filename);) 和反引号执行。 -
我实际上从未尝试过 Perl。我在写这个问题时想到了它,但我一直认为 Perl 也充满了难以理解的语法。 =D 我去看看——谢谢!
-
可以的。幸运的是,您不需要自己真正使用其中的大部分内容。
-
说说你对 Perl 的看法,但是一旦你的脚本超过 15 行,它就是 bash 的一个很好的替代品。它几乎可以保证安装在 Bash 的任何地方。
-
较新的外壳为向后兼容旧外壳提供了很多余地。您可以简化您的语法,决定始终使用
[[ ..... && .... || ... ]],作为一个夸张但有时适当的示例。这种风格[ .. ] && [ .... ]可以追溯到最初的 bourne shell,有些人觉得有必要使用它来实现可移植性。另请注意,当您需要 cmd-substituion 时,您可以在(( a++ ))或cnt=$(( a++ ))内进行任何数学运算,这无疑是一个不好的例子。无法帮助单个';'除了将每个命令放在单独的行上。 ';;'特定于案例陈述。祝你好运。
标签: bash shell scripting coffeescript