将Bash脚本转换为Shell

4

我有一些用Bash编写的脚本,现在需要将它们转换成Shell脚本。我知道Bash是Shell规范的扩展实现,因此,我想寻找一些关于Bash扩展的规范,也就是说,Bash中有哪些不属于Shell规范的部分,这样我就可以查看我的脚本并进行适当的修改了。 是否有这样的文档? 或者,对于如何进行转换的任何其他建议都将不胜感激。


4
使用 #!/bin/sh 声明的脚本在使用 shellcheck 工具时可以捕捉到许多仅适用于 bash 的语法。这些脚本有多大?你需要它们具备多高的可移植性? - Etan Reisner
“shell specification”是什么意思?有许多不同的shell,其中bash是其中之一。你是在特别谈论与Bourne Shell (sh)的兼容性吗? - Phylogenesis
2
他可能指的是POSIX shell规范 - chepner
知道需要在哪些系统上运行shell脚本会很有用。 - Brad Lanam
是的,我确实参考了POSIX shell规范。这些脚本相当长(大约有200个脚本,每个脚本只有几十行代码),而且我需要在各种系统上运行这些脚本。基本上,这些脚本应该在任何带有sh的nix系统上运行(事实上几乎所有nix系统都带有sh)。 - zuckermanori
3个回答

8
shellcheck 工具(使用 #!/bin/sh 作为 shebang)可以捕获许多 bash 语法。如果没有被捕获到,应该将其作为项目的错误报告。如果实现不是很困难,它们应该会在合理的时间内被添加。作者相当负责。

4

2
如果您使用的是基于Debian的发行版,可以使用由devscripts包提供的checkbashisms命令。
以下是checkbashisms突出显示的一个特定于bash的结构(称为bashism)的示例:在测试中使用==而不是=
$ cat b.sh
#!/bin/sh
VAR=foo if [ $VAR == bar ]; then echo 'bar!' fi
$ checkbashisms b.sh 
可能存在bashism,位于b.sh第4行(应该是“b = a”):
if [ $VAR == bar ]; then

我刚刚尝试了使用上面给出的示例脚本来检查bashisms,但没有得到任何结果。你有什么想法我做错了什么吗?这是我运行的命令: $checkbashisms test.sh,然后cli没有返回任何输出, 其中test.sh包含上面给出的脚本。 - zuckermanori
1
@zuckermanori,你在shebang中使用了/bin/sh而不是/bin/bash吗? - Christophe Vu-Brugier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接