モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

シェルスクリプトにおける数値計算

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2013/08/10
最終更新最終更新
2022/08/16
記事区分記事区分
一般公開

目次

    Ruby愛好家。Railsを使ったWebアプリ開発が得意です。

    シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。

    整数同士の計算

    整数同士の四則演算にはexprコマンドを使用します。

    sample.sh

    #!/bin/sh
    
    expr 1 + 1
    expr 1 - 1
    expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります
    expr 1 / 1
    expr 1 % 1
    

    実行例

    $ sh sample.sh 
    2
    0
    1
    1
    0
    

    大小比較

    大小比較にはtestコマンドを使用します。

    sample.sh

    #!/bin/sh
    
    CNT=0
    while [ $CNT -ne 10 ]  # "ne:!=", "eq:==", "lt:<", "le:<=", "gt:>", "ge:>="
    do
        CNT=`expr $CNT + 1`
        echo $CNT
    done
    

    実行例

    $ sh sample.sh 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    小数を含む計算

    小数を含む計算のためにはbcコマンドを使用します。echoで計算時のオプション等を指定してパイプで計算式を渡します。

    sample.sh

    #!/bin/sh
    
    echo "scale=3; 10/3" | bc # scaleで少数第何位まで出力するか指定可能
    echo "3.0*3.333" | bc # *のクォーテーションは不要
    

    実行例

    $ sh sample.sh 
    3.333
    9.999
    

    m進数からn進数への変換

    m進数からn進数への変換にもbcコマンドを利用できます。echoでmおよびnを指定してパイプで変換式を渡します。

    sample.sh

    #!/bin/sh
    
    echo "ibase=10; obase=2; 7" | bc # 10進数から2進数への変換
    

    実行例

    $ sh sample.sh 
    111
    

    bash 数値計算

    bash の場合は expr の代わりに $(()) が利用できます。

    echo $((1 * 2))
    echo $((1 + 2))
    

    set -e している場合で expr の結果が 0 になるとスクリプトが停止してしまう問題を回避できます。expr の終了ステータスは、結果が 0 の場合は 1 です。

    expr 1 - 1
    0
    
    echo $?
    1
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    Ruby愛好家。Railsを使ったWebアプリ開発が得意です。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • UNIX リダイレクションについて
        「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ1と2の対象ファイルの変更を指すことが多いです。 ファイルディスクリプタとは? ファイルディスクリプタは「プロセス」と「プロセスが使用するファイル」を結びつけるもので、それらには0,1,2,...と連続した番号が割り当てられています。ファイルディ...
      • egrepとgrepの違い
        grepは 'g'lobal 'r'egular 'e'xpression 'p'rint つまり、全体から正規表現で一致したものを抽出するためのコマンドです。egrepは 'e'xtended grep つまりgrepの機能拡張版です。拡張正規表現とよばれる式が使用できるため、grepと比較して高度な抽出が可能になります。とはいえ、grepに'-E'オプションを付与して実行するとegrepとほぼ...
      • シェルスクリプトにおける関数定義
        シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。 シェル関数は複数のコマンドをまとめたもの sample.sh #!/bin/sh echo1(){ echo 1 } echo1 実行例 $ ...
      • シェルスクリプトでシグナルをキャッチする
        無限ループに陥ってしまったプロセスを強制終了させるためにはCtrl-Cやkillコマンドを利用します。このとき、プロセスにはシグナルというものが送られています。プロセスはシグナルの種類に応じて既定された処理を実行します。trapコマンドを用いると、各シグナル番号に対応する既定の処理を書き換えることができます。 trapコマンド シグナルN1, N2, N3, ...を受けたときに実行するコマンドを...
      • シェルスクリプトにおける反復処理
        for sample.sh #!/bin/sh for i in a b c; do echo $i done ARR=( "abc" "xyz" ) for e in "${ARR[@]}"; do echo $e done 実行例 $ ./sample.sh a b c abc xyz while sample.sh #!/bin/sh cnt=1 while ...