この単純なスクリプトはインタプリタを使用して実行されます/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/sh
dash
Unixシステムマルチバイト文字をサポートしていないからです。bash
Linuxでも完全に互換性がない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/