それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash の組込 let による数値計算とインクリメント

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

インクリメント・デクリメントが使えます。

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 を返します。

関連記事

takuya-1st.hatenablog.jp

*1: expr はプロセス起動になるので、遅いです。遅くかろうが互換性にメリットを見出してるP○SIX原理主義者以外は使う必要がありません。