使用雙括號數學 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/bash
not的唯一功能/bin/sh
。那麼什麼肯定不會起作用/bin/sh
但可以起作用/bin/bash
呢?
該
$((math expression))
功能是一項 POSIX 功能,並受到所有現代 POSIX 兼容 shell 的支持。然而,POSIX 沒有標準化路徑名,因此 POSIX 將其稱為未指定當您呼叫時會發生什麼
/bin/sh
這就是POSIX沒有標準化
#! /bin/sh
eiter的原因……如果您呼叫
/bin/sh
. 直到 Solaris-10 的所有 Solaris 版本都帶有/bin/sh
不支持$((math expression))
. 這些 Solaris 版本仍然經過 POSIX 合規性認證。還有其他具有不同外殼類型(POSIX 或非 POSIX)的作業系統。
bash
Linux例如通常帶有dash
. 僅提供基本的 POSIX 兼容性,對於允許稱為UNIX的 POSIX 平台來說是不夠的,因為它不支持多字節字元。在 Linux 上也不完全兼容UNIX系統,因為(在 Linux 上)它的編譯方式預設會導致內置不兼容。/bin/sh``dash``bash``echo
順便說一句:如果您想在 POSIX 認證平台上獲得符合 POSIX 標準的外殼,您需要呼叫:
PATH=`getconf PATH` export PATH sh
這
getconf PATH
是有效的,因為需要返回一個 PATH 設置,其中首先找到符合 POSIX 的程序變體。換句話說:如果你有一個以 開頭的 shell 腳本
#!/bin/sh
,那麼它就不會$((math expression))
起作用。實際發生的情況取決於您執行它的平台。即使外殼符合 POSIX,也只需要 C 中的基本數學表達式即可工作。$((i++))
例如,不允許在經過 POSIX 合規性認證的外殼上工作。可以通過執行來檢查特定路徑名中的 shell:
$shell whatshell.sh
whatshell.sh
從https://www.in-ulm.de/~mascheck/various/whatshell/獲取