Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

$((算術展開))

Bashの算術展開『$(( ))』を使うと整数の四則演算・比較・ビット演算をシェルの組み込み機能だけで処理できます。外部コマンドの『expr』より高速で可読性も高いです。

構文
# 算術展開(結果を文字列として使う)
result=$(( 式 ))

# 算術コマンド(終了ステータスで真偽を返す)
(( 式 ))

# let コマンド
let "変数名=式"

# 旧来の外部コマンド(非推奨)
result=$(expr 式)
演算子一覧
演算子概要
+ - * / %加算・減算・乗算・整数除算・剰余です。
**べき乗です(例: 2**10 = 1024)。
++ --インクリメント・デクリメントです(前置・後置どちらも使えます)。
+= -= *= /= %=複合代入演算子です。
== != < > <= >=比較演算子です(真なら1、偽なら0を返します)。
&& ||論理 AND・OR です。
! ~ & | ^ << >>論理否定・ビット演算(NOT・AND・OR・XOR・シフト)です。
条件 ? 真 : 偽三項演算子です。
サンプルコード

基本的な四則演算です。『$(( ))』内では変数名に『$』を付けなくても参照できます。

a=10
b=3
echo "足し算: $(( a + b ))"
echo "引き算: $(( a - b ))"
echo "掛け算: $(( a * b ))"
echo "割り算: $(( a / b ))"
echo "余り:   $(( a % b ))"
足し算: 13
引き算: 7
掛け算: 30
割り算: 3
余り:   1

べき乗は『**』を使います。

echo "2の10乗: $(( 2**10 ))"
2の10乗: 1024

インクリメント・複合代入演算子で変数の値を更新します。

count=0
(( count++ ))
echo "インクリメント後: $count"

(( count += 5 ))
echo "+= 後: $count"
インクリメント後: 1
+= 後: 6

『(( ))』は条件分岐にも使えます。非ゼロなら終了ステータス 0(真)を返します。

num=7
if (( num > 5 )); then
    echo "$num は5より大きい"
fi
7 は5より大きい

C スタイルの for ループでカウンタを回します。

sum=0
for (( i=1; i<=10; i++ )); do
    (( sum += i ))
done
echo "1〜10の合計: $sum"
1〜10の合計: 55

三項演算子も使えます。

x=15
result=$(( x > 10 ? x * 2 : x + 10 ))
echo "result: $result"
result: 30

ビット演算(AND・シフト)です。

echo "ビット AND: $(( 0b1010 & 0b1100 ))"
echo "左シフト:   $(( 1 << 4 ))"
ビット AND: 8
左シフト:   16
概要

Bashの算術演算は整数のみ対応しています。小数計算が必要な場合は『bc』コマンドを使います(例: echo "scale=2; 10/3" | bc → 3.33)。

『$(( ))』内では変数名に『$』を付けなくても参照できます(付けても動作します)。ただし文字列変数や未定義変数は0として扱われます。

コマンド置換(『$()』)の使い方は コマンド置換 を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。