bash で数字を計算する let
bash で数字を計算するときに、どのような方法を使いますか?
数字を計算するときに、いくつか選択肢があります。
- expr
- let
- C style
主に、この3つのどれかだと思います。*1
今回はこの3つのうち、let について 見ていきたいと思います。
3つのサンプル
expr $a++ let a++ (( a++))
今回は、LETについて見ておきます。
let の使い方ヘルプの呼び出し方
let は シェル組み込み関数なので、マニュアルを見るときは help コマンドを使います。
help let
使い方を忘れる(あまりないけど)ときは、help を見るといつでも見ることができる。
let による数値計算
let による数値計算はC言語スタイルの数値計算とほぼ同じです。
let a=1 let a++ echo $a #=> 2
代入演算子も使えます
数値を変数に代入する省略した演算子も同様に利用することが出来ます。
a=2 let a*=3 echo $a #=> 6
使える、代入用のオペレータは =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= です。結構多いですね。魅力的です。
三項演算子も使えます。
便利なことに、三項演算子も使ったり出来ます。
let a=1 let a=(a ==2 ? 1 : 0) echo $a 0
「シェルスクリプトでは三項演算子が出来ない」という記事が多いが、bash など高機能なシェルでは「三項演算子」が使える。
「シェルスクリプト(/bin/shを想定した元来のシェル)では出来ない」という記述が正確であり、拡張された演算をもつbash など現代シェルでは三項演算子は可能です。
また、let expression は (( expression )) と同等で、(( )) は結果を取り出す$(( )) として使えることを思い出すと、次のようにも書ける。
a=3 echo $(( a ==2 ? 1 : 0 )) 0
インクリメント・デクリメントが使えます。
a=10 let a++ echo $a #=> 11
複数の式をまとめて記述することが出来ます。
a=10 let a++ a++ a++ echo $a #=> 13
let の help
let: let 引数 [引数 ...]
数式を評価します。
各 ARG を数式として評価します。評価は固定長の整数として行われ、桁溢れは
検査されません。しかし、0 による除算は捕捉されエラーとしてフラグが
立ちます。次の演算子一覧は同一優先順位の演算子ごとにグループ化されてい
ます。優先順位は降順になっています。
id++, id-- 変数の後置インクリメント、デクリメント
++id, --id 変数の前置インクリメント、デクリメント
-, + 単項マイナス、プラス
!, ~ 論理およびビット否定
** 指数演算
*, /, % 乗算、除算、剰余演算
+, - 加算、減算
<<, >> 左および右ビットシフト
<=, >=, <, > 比較
==, != 等価、不等価
& ビット論理積
^ ビット排他的論理和
| ビット論理和
&& 論理積
|| 論理和
expr ? expr : expr
条件演算子
=, *=, /=, %=,
+=, -=, <<=, >>=,
&=, ^=, |= 代入
シェル変数は被演算子として使用できます。変数名は数式内で (強制的に固定長
整数の) 値に置き換えられます。変数は数式内で使用する時には必ずしも
整数属性を持っている必要はありません。
演算子は優先順位の順に評価されます。小括弧でくくられた数式は先に評価され、
上記の優先順位を上書きするかもしれません。
終了ステータス:
ARG の最終的な評価値が 0 の場合 let は 1 を返します。それ以外の場合は
let は 0 を返します。
関連記事
2025-11-24
bash ではternary operator (三項演算子)が使えないという検索結果しかでてこないので、三項演算子は使えることを強調した