为什么使用 sh 和 bash 时会得到不同的输出?

为什么使用 sh 和 bash 时会得到不同的输出?

我有以下简单的脚本:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

运行时输出sh file.sh

Bash version ...
{1..99..2}

运行时输出bash file.sh

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

我有两个疑问:

  1. 如果我已经编写了指定 shell 的 shabang 行,那么无论我使用sh file.sh还是,它都不应该与 bash 一起运行bash file.sh吗?

  2. 我知道$BASH_VERSIONsh 无法识别,但是 for 循环有什么问题?为什么不打印数字?

答案1

sh,Bourne shell,是老的.其行为由POSIX 标准。如果您想要新的行为,您可以使用bashBourne Again shell,它会不断添加新功能。在许多系统上,sh它只是bash,并bash在以该名称运行时打开兼容模式。在 Ubuntu 上,shdash,Debian Almquist shell。

括号扩展是一个相对新功能,并且在较旧的 bash 中也不可用。它当然不应该在 中sh

仅当您将脚本作为可执行文件调用时,shebang 行才会被尊重:

./myscript.sh

我可以给脚本提供任何内容,并且仍然通过运行以下命令在 Python 中打开它:

python myscript.sh

请参阅这些关于 Unix 和 Linux 的优秀问题:

答案2

SH 很笨。它什么也做不了。

它只知道最基本的命令。它不做任何其他事情。

它无法将 {1..99} 理解为数值。它将其理解为字符串。

SH/Dash 尚未开发。它旨在作为 DIRE 情况下的紧急提示(在交互模式下。否则,它对于脚本来说真的是一件好事。)。

推荐使用 Bash,因为它可以完成 SH 的所有功能,并且还具有最新的定制和强大功能。

回答#1,#!只有直接调用程序时才会解析。(例如,./program.sh

相关内容