![扩展名为 bash 和 sh 的文件](https://linux22.com/image/146530/%E6%89%A9%E5%B1%95%E5%90%8D%E4%B8%BA%20bash%20%E5%92%8C%20sh%20%E7%9A%84%E6%96%87%E4%BB%B6.png)
bash
我对带有和扩展名的文件进行了一些研究sh
。大多数人和资源都说,如果文件有bash
扩展名,那么它就包含bash
脚本。同样,带有扩展名的文件sh
包含sh
脚本。
但是,我找不到 bash 和 sh 脚本之间的区别。有一些旨在教人们在 shell 上编写脚本的课程和文章,它们的标题都是shell scripting
。
在这一点上,shell脚本对应的是哪一个呢?
Bash 脚本或 Sh 脚本。
我试图了解 bash 和 sh 脚本之间的区别是什么。
答案1
POSIXland 中的文件名没有“扩展名”。文件名中的A.
与任何其他字符没有什么不同,除了我们这样的肉包可能赋予它们的含义之外,没有特定的含义。
一个可以希望任何名称以 结尾的文件.bash
都是要通过 shell 执行的脚本bash
,但不能保证这一点。
事实上,给予全部shell 脚本的后缀.sh
是无论其使用哪个解释器,如 shebang 行应该正确指定应使用哪个 shell 来执行此类文件。
sh
和bash
是两个不同但相关的 shell;其中两个,例如ksh
、csh
、zsh
、fish
、ash
、dash
以及更多其他。
每个 shell 都有自己的语法、功能、习惯和缺点;有些 shell 在很大程度上彼此兼容(通常为任何脚本编写的sh
也可以在或许多其他 shell 中运行bash
),但有些则不然。
答案2
我日常发现的唯一重要问题bash
是sh
比较运算符。在bash
双等于运算符中==
可用于字符串比较:
if [ "$var" == "foo" ]; then # bash
但这sh
是一个语法错误,因为它需要单个等于。
if [ "$var" = "foo" ]; then # sh
我并不是说这是唯一的区别,但这是一个常见的问题。