言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. Bash辞典
  3. $((算術展開))

$((算術展開))

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

構文

算術展開(結果を文字列として使います)。

result=$(( 式 ))

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

(( 式 ))

let コマンドを使います。

let "変数名=式"

旧来の外部コマンド(非推奨)。

result=$(expr 式)

演算子一覧

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

サンプルコード

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

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

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

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

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

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

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

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

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

なお、if 文はターミナルでも直接入力できます。『then』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『fi』を入力すると実行されます。

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

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

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

なお、for 文はターミナルでも直接入力できます。『do』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『done』を入力すると実行されます。

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

三項演算子も使えます。

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

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

bitwise.sh
echo "ビット AND: $(( 0b1010 & 0b1100 ))"
echo "左シフト:   $(( 1 << 4 ))"
bash bitwise.sh
ビット AND: 8
左シフト:   16

概要

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

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

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

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