回答:
これらはすべて算術を扱いますが、方法は異なり、変数は異なる方法で作成されます。これらのいくつかはbash
シェルに固有ですが、他のものはそうではありません。
$((...))
は算術展開と呼ばれ、これはbash
やksh
シェルの典型です。これにより、単純な整数演算が可能になりますが、浮動小数点は使用できません。中のように式の結果は、式を置き換えるecho $((1+1))
になりますecho 2
((...))
は算術評価と呼ばれ、if ((...)); then
or while ((...)) ; do
ステートメントの一部として使用できます。算術展開展開$((..))
は、演算の出力を置き換え、変数を割り当てるために使用できますi=$((i+1))
が、条件ステートメントでは使用できません。$[...]
非推奨の算術展開の古い構文です。も参照してください。古いbash
スクリプトが壊れないように、これはおそらく維持されました。これはで動作しませんでしたksh93
ので、私の推測では、この構文はbash固有のものです。注:ここではスペースが非常に重要です。の$[1+1]
ようなものと混同しないでください[ $a -eq $b ]
。[
スペースでは、として知られているtest
コマンド、そしてあなたは、一般的に意思決定の部分でそれを参照してください。動作と目的が大きく異なります。let
は、単純な算術評価で変数を作成できるbash
and ksh
キーワードです。そこに文字列を割り当てようとするとlet a="hello world"
、構文エラーが発生します。Worksでbash
とksh93
。$(...)
コマンド置換で、文字通りコマンドの出力を取得して変数に割り当てます。ここでのコマンドはexpr
、です。これは、などの位置引数をexpr arg1 arg2 arg3
使用するため、スペースが重要です。整数演算用の小さなコマンドライン計算機に加えて、いくつかのtrue / falseおよび正規表現タイプのものに似ています。これはシェルに依存しないコマンドです。また、算術展開とコマンド置換がで指定されていることは注目に値しますPOSIX標準ながら、let
と$[...]
ではありません。
let
コマンドは算術評価を実行し、組み込みのシェルです。
このコマンドを実行すると、何も得られません(評価のみ):
let 1+2
$(( ))
算術演算を実行するために使用される拡張を:ここで読みます
これを実行すると、エラーが発生します(展開のため):
$((1+2))
$[ ]
算術展開の古い構文です:
古い形式の$ [expression]は非推奨であり、bashの予定で削除されます。 バッシュマンページ
expr
はバイナリコマンドです。コマンド置換内で算術展開を行いたい場合は、それを使用できます:
echo $(expr 1 + 2)
echo `expr 1 + 2`
上記の回答のいくつかは具体的に言及ksh93
しているので、浮動小数点演算ができることに注意する価値があります。たとえば:
$ print $((1.0/3))
0.333333333333333333
printfを使用して、出力の精度を制御できます。例:
$ printf "%.4f\n" $((1.0/3))
0.3333
上記のように、少なくとも1つの引数を浮動小数点数として指定する必要があります。両方が整数として指定されている場合、整数演算のみが行われます。例:
$ print $((1/3))
0
これは、外部コマンドの呼び出しを回避できるため、シェルスクリプトで浮動小数点演算が必要な場合に役立ちます。
zsh
答えを投稿しました。ksh
とbash
は(一般に)どちらよりも似ているので、その質問への回答は非常に有用zsh
であると思われますkh93
。
((...))
実際に割り当てのために使用することができbash
、ksh
そしてzsh
:n=10; ((n+=10)); echo $n
プリント20と((x=1)); echo $x
プリント1