我有以下简单的脚本:
#!/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
我有两个疑问:
如果我已经编写了指定 shell 的 shabang 行,那么无论我使用
sh file.sh
还是,它都不应该与 bash 一起运行bash file.sh
吗?我知道
$BASH_VERSION
sh 无法识别,但是 for 循环有什么问题?为什么不打印数字?
答案1
sh
,Bourne shell,是老的.其行为由POSIX 标准。如果您想要新的行为,您可以使用bash
Bourne Again shell,它会不断添加新功能。在许多系统上,sh
它只是bash
,并bash
在以该名称运行时打开兼容模式。在 Ubuntu 上,sh
是dash
,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
)