数学の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/bash唯一の機能ではないようです/bin/sh。それでは必ず何が起こるのかいいえで働いていますが、/bin/sh仕事をしていますか/bin/bash

答え1

この$((math expression))機能は POSIX 機能であり、すべての最新の POSIX 準拠シェルでサポートされます。

ただし、POSIXはパス名を正規化しないため、POSIXはこれを「未指定」と呼びます。/bin/sh

POSIXが標準化されていない理由は次のとおりです#! /bin/sh

一部のUNIXバージョンでは、以前のBourne Shellを呼び出すとこれが提供されます/bin/sh。 Solaris-10より前のすべてのバージョンのSolarisには、/bin/shサポートされていない古いBourne Shellが付属しています$((math expression))。これらのSolarisバージョンは依然としてPOSIX準拠の認証を受けています。さまざまなシェルタイプ(POSIXまたは非POSIX)を使用する他のオペレーティングシステムがあります。

たとえば、Linuxには通常、またはbash。呼び出しを許可するPOSIXプラットフォームを満たすには、不足している基本的なPOSIX互換性のみを提供します。dash/bin/shdashUnixシステムマルチバイト文字をサポートしていないからです。bashLinuxでも完全に互換性がないUnixシステムechoシステム(Linux)は、デフォルトで互換性のない組み込み機能を生成するようにコンパイルされます。

注:POSIX認証プラットフォームからPOSIX準拠のシェルを取得するには、次のものを呼び出す必要があります。

PATH=`getconf PATH`
export PATH
sh

getconf PATHこれは、プログラムのPOSIX準拠のバリエーションが最初に見つかった場所でPATH設定を返す必要があるために機能します。

つまり、で始まるシェルスクリプトがあると動作しないと#!/bin/sh予想されます。$((math expression))実際に何が起こるかは、実行しているプラ​​ットフォームによって異なります。シェルがPOSIXと互換性がある場合でも、機能するにはCの基本的な数学式のみが必要です。$((i++))たとえば、POSIX準拠の認証を受けたシェルで作業する権限がありません。

次のコマンドを実行して、特定のパス名に実際にどのシェルが含まれているかを確認できます。

$shell whatshell.sh

whatshell.shからインポートhttps://www.in-ulm.de/~mascheck/various/whatshell/

関連情報