| author | プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com> | |
|---|---|---|
| created | 2026-07-29 | |
| draft | true | |
| tags |
|
|
| title | 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算術式内でのリテラル整数値表現は、文字定数や unsingned や long を指示する接尾辞を使えないことを除けば C 言語に従う:
| 先頭 | 解釈 |
|---|---|
0 |
八進数 |
0x or 0X |
十六進数 |
base# |
基数 base での数 |
| なし | 十進数 |
ここで base は 2 から 64 までの十進数とする。
base#n 表記において n を指定する際、基数が 10 より大きいと数字以外の文字が必要になる。
9 より大きい数字は次の順で表現される:
- 小文字
- 大文字
@_
なお、基数 base が 36 以下の場合、10 から 35 までの数字を表すのに小文字と大文字を互換してもよい。