这个简单的脚本使用解释器运行/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/bash
not的唯一功能/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 通常带有bash
或dash
中的一个/bin/sh
。dash
只提供基本的 POSIX 兼容性,不足以满足允许调用的 POSIX 平台UNIX系统因为它不支持多字节字符。bash
Linux 上也不完全兼容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.sh
https://www.in-ulm.de/~mascheck/various/whatshell/