2010-10-25 54 views
3

任何人都可以让我知道编码指南以及Unix shell脚本的代码示例,通过代码可以运行在大多数当前shell如ksh,bash, csh等。大部分时间我为ksh编写的一些代码在普通sh上不起作用。我想让我的代码最大限度地便携。我的大部分代码将围绕[ifs,elifs]和[whiles,fors]并返回子shell的代码捕获(主要是运行SQL脚本,我希望获得一些返回代码,如处理的行数,返回码,SQL脚本的错误码)。足够便于在所有shell上运行的Unix shell代码

也可以让任何人知道哪些shell特定的代码可以很容易地移植到其他shell吗?任何人都可以将我指向正确的教程和/或示例代码?

回答

2

为什么不用Perl或python编写脚本?

+0

这是我的第一选择。商业上的原因......他们不同意使用perl/python,他们没有说出很好的理由......所以不得不从shell和shell开始也是一个不错的选择......是不是......它也有很好的功能。 – 2010-10-25 06:59:56

+0

对于许多任务来说,shell脚本的使用非常简单而高效。但一旦涉及到更复杂的事情,特别是处理数据,这不是我的第一个意见了。只要告诉他们,它将花费更多,因为你需要更多的时间:P – joni 2010-10-25 07:11:22

+0

这个选择不在我的手中......对不起的朋友......但遵循良好的可移植unix shell脚本的指导原则是我目前正在寻找...暂且...谢谢 – 2010-10-25 07:13:11

12

给自己一个7th Edition Unix Programmer's Manual (Vol 1)并编程到这里描述的(Bourne)shell符号。如果您能找到适当的手册,您实际上可以升级到System V(Bourne)shell;它具有一些额外的功能,比如第7版外壳没有的功能,而且它们在任何地方都是可用的。 (这是一个非常保守的立场 - 但它会给你最大的便携性。)

另一个问题是选择使用哪些命令以及哪些选项用于这些命令。例如,GNU grep有许多有用的选项,这些选项在别处不可用。 GNU sed类似地具有其他地方不可用的扩展。如果你编写你的shell脚本来使用这些扩展,你的代码将是不可移植的,即使这些shell都能正确理解语法。

我建议您意识到POSIX标准所说的便携性。绝大多数POSIX功能通常都是由大多数系统支持的,但每个系统通常会增加一些额外的选项和功能,这些选项和功能并不总是可用。请注意,POSIX外壳确实具有一些功能,特别是$(...)命令替换,而不是原始Bourne shell中的反标号。您必须决定更现代的符号带来的清晰度是否值得(可能的)便携性的损失。

而且,Autoconf shell准则集中在最大可移植性上。然而,结果是一个相当高度的shell脚本版本,不仅仅是因为它必须与宏处理器互通,这会导致一些额外的限制。


请注意,编写可与Bourne/Korn/POSIX shell系列和C Shell系列一起使用的可移植shell脚本实际上是不可能的。有strong arguments来总结“你不应该在C shell中编写脚本”。

+0

+1提供实用程序选项和POSIX。 – 2010-10-25 19:40:19

+0

+ POSIX和autoconf指南(autoconf手册的相关部分是http://www.gnu.org/software/autoconf/manual/html_node/Portable-Shell.html – 2010-10-26 09:27:08

0

还有Steve Parker的Bourne/Bash在线shell脚本教程或书籍,例如Chris F.A. Johnson撰写的“Shell Scripting Recipes:A Problem-Solution Approach”。

要测试最大可移植性,您可以使用bournesh。

http://freshmeat.net/projects/bournesh/

+0

这里是[直接链接](http ://heirloom.sourceforge.net/sh.html)传递给Heirloom Bourne Shell – 2010-10-25 19:35:07

4

可移植性简短的回答是写为最小公分母这是伯恩壳(sh)并避免其具有不兼容的语法和serious limitations C外壳程序脚本。 Bourne shell应该普遍可用,并且大多数系统启动和管理脚本都是为它编写的。

您提到的所有功能都可以在sh中找到。缺少的主要事情之一是支持数组,但这可以解决。

有一点需要记住的是,shell脚本的大部分功能都是由可从任何shell访问的外部实用程序提供的。

+0

只需检查从'/ bin/sh'到'/ bin/bash'的符号链接,很多系统使用的符号链接不会以某种方式改变bash的行为,对吗?对于这些系统,你不会真正得到'sh'行为吗? – Praxeolitic 2015-07-27 17:40:53

+1

@Praxeolitic:根据[documentation](http://www.gnu.org/software/bash/manual/bash .html#Bash-POSIX-Mode),“当调用'sh'时,Bash在读取启动文件后进入POSIX模式。”链接部分列出了受POSIX模式影响的事情。 – 2015-07-27 20:22:27

0

可以使用Loker用于检查语法是否符合POSIX标准。