使用双括号数学 posix 是否兼容?

使用双括号数学 posix 是否兼容?

这个简单的脚本使用解释器运行/bin/sh

#!/bin/sh
#!/bin/bash

fac=1

for i in $(seq 1 $1); do
    fac=$((fac*i))
done
echo "The factoriral of $1 is $fac"

但我想知道它为什么起作用,当$((math))它存在时。我认为这是/bin/bashnot的唯一功能/bin/sh。那么肯定会发生什么不是工作于/bin/sh但工作于/bin/bash?

答案1

$((math expression))功能是 POSIX 功能,并受所有现代 POSIX 兼容 shell 的支持。

然而 POSIX 并没有标准化路径名,因此 POSIX 称其为“未指定”,当您调用时会发生什么/bin/sh

这就是 POSIX 没有标准化的原因#! /bin/sh......

如果您调用 ,有些 UNIX 版本会提供旧的 Bourne Shell /bin/sh。 Solaris-10 之前的所有 Solaris 版本都附带旧的 Bourne Shell,/bin/sh不支持$((math expression)).这些 Solaris 版本仍经过 POSIX 合规性认证。还有其他具有不同 shell 类型(POSIX 或非 POSIX)的操作系统。

例如,Linux 通常带有bashdash中的一个/bin/shdash只提供基本的 POSIX 兼容性,不足以满足允许调用的 POSIX 平台UNIX系统因为它不支持多字节字符。bashLinux 上也不完全兼容UNIX系统系统(在 Linux 上)它的编译方式echo默认会导致不兼容的内置。

顺便说一句:如果您想在 POSIX 认证的平台上获得 POSIX 兼容的 shell,您需要调用:

PATH=`getconf PATH`
export PATH
sh

这是有效的,因为getconf PATH需要返回一个 PATH 设置,其中首先找到程序的 POSIX 兼容变体。

换句话说:如果您有一个以 开头的 shell 脚本#!/bin/sh,则并不认为它$((math expression))可以工作。实际发生的情况取决于您运行它的平台。即使 shell 符合 POSIX 标准,也只需要 C 语言的基本数学表达式即可工作。$((i++))例如,不被授权在已通过 POSIX 合规性认证的 shell 上工作。

可以通过运行以下命令来检查特定路径名中实际包含的 shell:

$shell whatshell.sh

取自whatshell.shhttps://www.in-ulm.de/~mascheck/various/whatshell/

相关内容