Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Created July 29, 2026 13:06
Show Gist options
  • Select an option

  • Save showa-yojyo/615f43f2b0473ebb32739b2a7be68d11 to your computer and use it in GitHub Desktop.

Select an option

Save showa-yojyo/615f43f2b0473ebb32739b2a7be68d11 to your computer and use it in GitHub Desktop.
A note on arithmetic features in Bash
author プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com>
created 2026-07-29
draft true
tags
bash
title Bash 算法ノート

Bash 算法ノート

Bash では特定の文脈で整数型値に対する演算を行うことが可能だ。

演算可能箇所

  • 混合コマンドの一種である二重丸括弧 (( ... )) 内部
  • 組み込みコマンド let の右辺
  • 組み込みコマンド declare -i の右辺
  • 混合コマンドの一種である for ループ内 (( ... )) 内部
  • 変数が整数型だと Bash が承知している条件での、そのような変数に値を代入するような算術式。
  • 条件コマンドの一種である [[ ... ]] の内部
  • 普通の配列の [ ... ] 内部

素朴な算術実行例:

$ let a="2**2 * 3"
$ declare -i b="1985 >> 3"
$ ((c = a - b))
$ echo $c
-236

算術 for の例を示す。こういう処理では中括弧展開や seq(1) を利用するほうが自然だ:

$ for ((i = 0; i < 5; ++i)) do echo hello world $i; done
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4

条件式で数値を比較する例を示す。配列に $ がないことと、不等号と右辺の間に空白文字を入れていないことに注意しろ:

$ if [[ BASH_VERSINFO[0] >=5 ]]; then
>     echo you use latest bash
> fi
you use latest bash

配列の添字に算法を用いる非現実的例:

$ echo ${BASH_VERSINFO[99 * 0]}
5

算術展開

二重丸括弧の頭に $ を付けると変数展開の算術版、算術展開がなされる。例:

$ echo $((2 + 3))
5

算術仕様

基本的には C 言語の仕様に準じる。この早見表から整数型で有効な演算子を拾えば Bash での演算優先表が作れる。

  • 演算は利用可能な最大の固定幅整数で行われる。
  • オーバーフロー例外の処理のようなことはしない。
  • ゼロによる除算は把握する。エラーフラグが立つ。
  • 演算優先度、結合則、値は C 言語と同じ。

Note

実はべき乗演算子 ** が使える。演算子 *, /, % より優先される。

Tip

命令 help let の出力で演算優先表を確認できる。

シェル変数を用いる

シェル変数を算術演算のオペランドとして使用できる。

  • 変数展開があれば算術式が評価される前になされる。
  • 式の中ではシェル変数を $ を付けずに名前だけで参照することが可能。
  • 空または未設定のシェル変数は、式内で値を参照されると 0 と評価される。

Note

ShellCheck などのコードチェッカーは $ を付けないほうを好む。

算術式で使用するためにシェル変数を整数属性を有効にする必要はない。例:

$ echo $((${#PATH} > 10))
1

リテラルにおける基数表記

算術式内でのリテラル整数値表現は、文字定数や unsingnedlong を指示する接尾辞を使えないことを除けば C 言語に従う:

先頭 解釈
0 八進数
0x or 0X 十六進数
base# 基数 base での数
なし 十進数

ここで base は 2 から 64 までの十進数とする。

base#n 表記において n を指定する際、基数が 10 より大きいと数字以外の文字が必要になる。 9 より大きい数字は次の順で表現される:

  • 小文字
  • 大文字
  • @
  • _

なお、基数 base が 36 以下の場合、10 から 35 までの数字を表すのに小文字と大文字を互換してもよい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment