Bash

使用雙括號數學 posix 兼容嗎?

  • October 30, 2020

這個簡單的腳本使用/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呢?

$((math expression))功能是一項 POSIX 功能,並受到所有現代 POSIX 兼容 shell 的支持。

然而,POSIX 沒有標準化路徑名,因此 POSIX 將其稱為未指定當您呼叫時會發生什麼/bin/sh

這就是POSIX沒有標準化#! /bin/sheiter的原因……

如果您呼叫/bin/sh. 直到 Solaris-10 的所有 Solaris 版本都帶有/bin/sh不支持$((math expression)). 這些 Solaris 版本仍然經過 POSIX 合規性認證。還有其他具有不同外殼類型(POSIX 或非 POSIX)的作業系統。

bashLinux例如通常帶有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.shhttps://www.in-ulm.de/~mascheck/various/whatshell/獲取

引用自:https://unix.stackexchange.com/questions/617118