【发布时间】:2010-04-23 14:16:23
【问题描述】:
有什么区别:
if IsServerStarted ; then ...
和
if [ IsServerStarted -eq 0 ] ; then ...
在我看来,这两个语句应该是等价的?奇怪的是,第二个陈述总是正确的。
【问题讨论】:
-
@skaaffman 将标签从 bourne 更改为 bash。为什么? Bourne 不是 bash 的一个子集吗?
-
Bourne 是 1970 年代的一个古老的 shell,没有人再使用了——它不是严格的 bash 子集(例如,Bourne 允许
^作为管道字符,而在现代 POSIX shell 中,包括 bash,只有|有效)。在现代系统上,/bin/sh保证是符合 POSIX sh 的 shell,这是一个受 ksh 严重影响的新规范,ksh 是从 Bourne 获得灵感的以前的商业 shell。因此,从现代贝壳返回伯恩有一条漫长而曲折的道路,但这不是今天任何人使用的东西;即使在 20 年前,也只有 Solaris 还在发货。 -
...所以说 POSIX sh 和 bash 是“Bourne 系列”外壳是正确的,但它们实际上并不与 Bourne 兼容——并非所有 Bourne 代码都可以在它们上运行。 (并且编写与 pre-POSIX Bourne 正确运行的代码还需要大量额外的工作来处理古老版本的
test/[中的错误——当人们回到 pre-POSIX 世界时,一些"x$foo"成语其实是有理由存在的)。
标签: shell if-statement sh exitstatus